使用ProcessPoolExecutor无法启动main函数 程序直接停止无输出
代码问题原因及修复方案
核心错误点
- 变量作用域不匹配:你定义的
thread_pool、threads等变量全部在if __name__ == "__main__"代码块内部,Python多进程(尤其是Windows默认的spawn启动模式,类Unix系统Python3.8+也默认使用该模式)启动子进程时会重新导入整个脚本,此时子进程不会执行if __name__ == "__main__"内的代码,main函数运行时访问不到thread_pool和threads变量,直接抛出NameError。 - 不可序列化对象跨进程传递:
ThreadPoolExecutor属于线程相关资源,无法被序列化后传递到子进程,就算作用域没有问题,跨进程传递后也无法正常使用。 - 未捕获子进程异常:
ProcessPoolExecutor提交的任务抛出异常时不会主动打印异常信息,只有调用任务的result()方法时才会抛出异常,所以你看不到任何报错输出,程序直接终止。
修复后的代码示例
import sys import os from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor # 补全你逻辑中依赖的函数,可替换为自己的实现 def sussy_baka(): # 你的业务逻辑 pass def readLines(file_path): with open(file_path, 'r', encoding='utf-8') as f: return [line.strip() for line in f if line.strip()] def main(threads): # 线程池放到子进程内部定义,不要跨进程传递 with ThreadPoolExecutor(max_workers=threads) as thread: for _ in range(threads): thread.submit(sussy_baka) if __name__ == "__main__": host = sys.argv[1] port = int(sys.argv[2]) threads = int(sys.argv[3]) path = sys.argv[4] file = sys.argv[5] proxies = readLines(file) cpu_count = os.cpu_count() process_pool = ProcessPoolExecutor(max_workers=cpu_count) with process_pool as process: tasks = [] for _ in range(cpu_count): # 把需要的参数通过submit传递给main函数,不要依赖全局变量 future = process.submit(main, threads) tasks.append(future) # 主动调用result获取结果,才能抛出子进程的异常方便排查 for task in tasks: task.result()
内容的提问来源于stack exchange,提问作者kenegdane
相关产品推荐
相关产品推荐

