Python 3.6.8下multiprocessing.Pool.apply_async()无响应问题咨询
问题原因
apply_async是异步非阻塞方法,你的代码仅完成了任务提交步骤,未添加等待任务执行的逻辑:with代码块执行完毕后会立即销毁进程池,子进程还未启动或执行完成就被终止,因此没有输出也不会抛出错误。- MacOS平台Python 3.6.8默认使用
fork作为多进程启动方法,存在系统兼容性问题,可能导致子进程执行异常;同时子进程的print输出默认存在I/O缓冲,进程被提前销毁时缓冲内容不会刷新到终端。
修复方案
- 提交所有任务后添加等待逻辑:可以通过调用每个异步返回结果的
get()方法,或先关闭进程池再调用join()方法阻塞等待所有任务执行完成 - 手动设置多进程启动方法为
spawn,适配MacOS系统的运行限制(Python 3.8及以后版本MacOS默认已使用该启动方法) - 打印内容时添加
flush=True参数,禁用I/O缓冲,保证输出即时同步到终端
可正常运行的修复后代码
import time import multiprocessing from multiprocessing import Pool def worker(sl): print(sl, flush=True) time.sleep(sl) return sl if __name__ == '__main__': # 适配MacOS设置多进程启动方法 multiprocessing.set_start_method('spawn') result_list = [] with Pool(processes=3) as pool: for i in range(5, 30, 5): res = pool.apply_async(func=worker, args=(i,)) result_list.append(res) # 等待所有任务执行完成并获取返回值 for res in result_list: print(f"任务返回结果:{res.get()}", flush=True)
内容的提问来源于stack exchange,提问作者sathish j
相关产品推荐
相关产品推荐

