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
相关产品推荐
相关产品推荐

