向ProcessPoolExecutor提交任务时类方法未被调用的问题
ProcessPoolExecutor类方法任务无输出问题修复
可运行的修复后代码
import time from concurrent.futures import ProcessPoolExecutor # 其他模块文件 class MyClass: def __init__(self): pass def run(self, secondsToSleep): print("start running...", flush=True) time.sleep(secondsToSleep) return "执行完成" # 主文件 def main(): obj = MyClass() with ProcessPoolExecutor(max_workers=5) as executor: # 传参不需要套元组,直接传入参数值即可 future = executor.submit(obj.run, 10) # 获取执行结果,主动捕获子进程异常 print(future.result()) # with上下文会自动执行shutdown(wait=True),不需要手动调用 if __name__ == "__main__": main()
问题原因
- 传参格式错误:
executor.submit传入任务参数时不需要额外套一层元组,原代码传入(10,)相当于给run方法传入了一个元组类型的参数,执行time.sleep时会触发TypeError,子进程直接终止,自然不会执行到输出逻辑。 - 未捕获子进程异常:子进程运行时抛出的异常不会默认打印到主进程控制台,必须调用
future.result()才能拿到异常信息,原代码没有做异常捕获,无法感知子进程运行报错。 - 缺少依赖导入:代码中使用了
time.sleep但没有导入time模块,属于基础语法错误,会直接终止子进程运行。 - Windows平台缺少入口保护:Windows系统下Python多进程必须加
if __name__ == "__main__":入口保护,否则子进程启动时会重复导入主模块,导致进程启动逻辑异常。 - 输出缓冲问题:
print默认会开启输出缓冲,没到缓冲阈值不会主动输出到控制台,加上flush=True可以强制立即刷出内容。
内容的提问来源于stack exchange,提问作者pepsi
相关产品推荐
相关产品推荐

