Python使用multiprocessing实现for循环并发执行的问题求解
问题原因分析
- 第一版代码错误原因:你在第一次for循环迭代时就调用了
pool.close()和pool.join()关闭了进程池,第二次循环再向已关闭的进程池提交任务,就会触发Pool is still running的报错。 - 第二版代码空白无输出的常见原因:
- 每次循环都重新创建、销毁进程池,进程池创建开销极大,循环10000次的资源消耗会直接阻塞程序运行
- Windows平台下没有添加多进程启动的入口守卫
if __name__ == '__main__',会导致进程无限递归启动,无法正常执行任务
正确实现代码
import multiprocessing as mp # 你的三个业务函数,替换为自身实现即可 def function1(bid, ask): print(f"func1执行,bid={bid}, ask={ask}") def function2(bid, ask): print(f"func2执行,bid={bid}, ask={ask}") def function3(bid, ask): print(f"func3执行,bid={bid}, ask={ask}") if __name__ == '__main__': # 进程池全局仅初始化一次,避免重复创建的开销 pool = mp.Pool(mp.cpu_count()) # 按需求遍历i的范围,需要10000次就修改range参数即可 for i in range(0, 1000): bid = i ask = i # 提交3个异步任务,保存返回的任务对象 tasks = [ pool.apply_async(function1, args=(bid, ask,)), pool.apply_async(function2, args=(bid, ask,)), pool.apply_async(function3, args=(bid, ask,)) ] # 等待当前i对应的所有任务全部执行完成,再进入下一轮循环 for t in tasks: # 需要获取函数返回值就用t.get(),不需要返回值用t.wait()也可以 t.wait() # 所有循环全部执行完成后再关闭进程池 pool.close() pool.join()
实现说明
- 进程池仅初始化一次,避免了重复创建销毁的额外性能开销
- 每次提交当前i对应的3个任务后,通过等待所有任务对象执行完成,严格保证不会提前进入下一轮循环
- 入口守卫
if __name__ == '__main__'是Python多进程在Windows平台运行的强制要求,缺少该配置会直接导致程序无法正常执行
内容的提问来源于stack exchange,提问作者Hash Line
相关产品推荐
相关产品推荐

