You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:35:26