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

Windows环境下Python 3.11多进程模块调用问题求助

Windows下Python 3.11 multiprocessing模块问题排查与解决

嘿,我看你在Windows环境用Python 3.11的multiprocessing模块时遇到了麻烦,先把你贴的脚本整理出来(看起来another_func的代码被截断了,我先补了个简单的打印示例):

from multiprocessing import Process
import os
import time

def info(title):
    print(title)
    print('module name:', __name__)
    if hasattr(os, 'getppid'): # only available on Unix
        print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('--- hello', name)
    time.sleep(5)
    print('--- bye', name)

def some_func():
    print('Running some_func function')

def another_func():
    print('Running another_func function') # 原代码截断处补全示例

在Windows下用multiprocessing最容易踩的坑就是缺少if __name__ == '__main__':保护块,因为Windows没有Unix的fork机制,multiprocessing默认用spawn模式启动子进程——这意味着每个子进程都会重新导入你的主脚本,如果没有这个判断,子进程会重复执行启动代码,导致无限创建进程或者报错。

给你修正后的完整可运行版本:

from multiprocessing import Process
import os
import time

def info(title):
    print(title)
    print('module name:', __name__)
    if hasattr(os, 'getppid'): # only available on Unix
        print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('--- hello', name)
    time.sleep(5)
    print('--- bye', name)

def some_func():
    print('Running some_func function')

def another_func():
    print('Running another_func function')

# 核心:Windows下必须把进程启动代码放在这个判断块里
if __name__ == '__main__':
    # 启动第一个子进程,执行f函数并传参
    p1 = Process(target=f, args=('Alice',))
    p1.start()
    print('主进程:等待子进程p1完成...')
    p1.join()

    # 如果需要启动其他函数的进程,照葫芦画瓢就行
    p2 = Process(target=some_func)
    p2.start()
    p2.join()

    p3 = Process(target=another_func)
    p3.start()
    p3.join()

再给你划几个重点:

  • if __name__ == '__main__': 是Windows环境下使用multiprocessing的硬性要求,没有它大概率会出问题;
  • 创建Process实例时,target填你要执行的函数名,args是函数的参数,必须是元组(哪怕只有一个参数,也要写成(arg,));
  • start()方法真正启动子进程,join()方法让主进程等待子进程结束,避免主进程先退出导致子进程被强制终止。

如果你的another_func有更复杂的逻辑,比如需要传参,只需要调整args参数就行,比如Process(target=another_func, args=('test',))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:18:44