Python中如何并行调用内部含并行逻辑的函数?
问题解答
1. 能否将所有代码写在同一个脚本中?
可以,完全没问题,但需要遵循Python多进程的运行规则,尤其是Windows系统下的进程启动机制,避免出现无限创建子进程的错误。
2. 正确的写法是什么?
不需要在fun2内部加if __name__ == '__main__',但要注意两个核心要点:
- 所有触发并行逻辑的顶层可执行代码,必须放在
if __name__ == '__main__'代码块内,否则Windows系统下子进程启动时会重复执行这些代码,导致递归创建进程。 - 进程池最好用
with上下文管理器管理,它会自动关闭池并等待子进程完成,避免资源泄漏。
修正后的完整代码如下:
import multiprocessing def fun1(a, b): return a + b def fun2(m, n): # 生成mn个元组的列表 list_tuple = [(i, j) for i in range(m) for j in range(n)] # 用上下文管理器创建进程池,自动处理生命周期 with multiprocessing.Pool() as pool: return pool.starmap(fun1, list_tuple) if __name__ == '__main__': # 生成待处理的(m,n)元组列表 list_tuple = [(m, n) for m in range(10) for n in range(10)] # 并行调用fun2 with multiprocessing.Pool() as pool: results = pool.starmap(fun2, list_tuple) # 可打印部分结果验证 print(results[:2])
关键说明:
if __name__ == '__main__'的作用:Windows系统中子进程通过重新导入脚本启动,这个判断能确保只有主进程执行并行逻辑,子进程不会重复触发,避免无限创建进程。- 嵌套进程池的兼容性:Unix/Linux用fork模式启动子进程,嵌套池天然支持;Windows用spawn模式,只要函数定义在顶层(不在
if __name__块内),子进程就能正确导入并执行。
3. 如果分两个脚本实现,该怎么做?
拆分代码可以让逻辑更清晰,适合复杂场景:
脚本1:functions.py(存放函数定义)
import multiprocessing def fun1(a, b): return a + b def fun2(m, n): list_tuple = [(i, j) for i in range(m) for j in range(n)] with multiprocessing.Pool() as pool: return pool.starmap(fun1, list_tuple)
脚本2:main.py(主程序入口)
import multiprocessing from functions import fun2 if __name__ == '__main__': list_tuple = [(m, n) for m in range(10) for n in range(10)] with multiprocessing.Pool() as pool: results = pool.starmap(fun2, list_tuple) print(results[:2])
运行时直接执行main.py即可。
内容的提问来源于stack exchange,提问作者Landon Carter
相关产品推荐
相关产品推荐

