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

多进程spawn重复执行已完成代码,仅运行目标函数求助

问题根源

在Windows系统(或使用spawn启动方式的环境,比如PyInstaller打包后的程序)中,multiprocessing创建子进程时会重新加载整个脚本文件。所有写在if __name__ == "__main__"代码块之外的顶层代码,都会被每个子进程重复执行——这就是你看到重型进程提示多次打印的原因。

解决办法

把只需要执行一次的重型初始化逻辑,以及子进程不需要运行的代码,全部移到if __name__ == "__main__"代码块内部。子进程需要用到的初始化数据,通过参数传递给目标函数即可。

修改后的代码示例:

import multiprocessing

def multiply_it(listed):
    print([x*2 for x in listed])

if __name__ == "__main__":
    multiprocessing.freeze_support()
    
    # 仅主进程执行的重型初始化
    print("I am a heavy process that should only run once. ")
    listing = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]

    for listed in listing:
        multiprocessing.Process(target=multiply_it, args=(listed,)).start()
效果验证

运行修改后的代码,输出会和你的期望一致:

I am a heavy process that should only run once
[2, 4, 6, 8]
[10, 12, 14, 16]
[18, 20, 22, 24]

如果你的初始化数据量极大,直接传参效率低下,可以考虑用multiprocessing.Manager创建共享数据结构,或者使用Pool配合initializer(注意initializer是每个子进程启动时执行一次,若需全局仅一次的初始化,仍需放在主进程块内)。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:11