在函数内部启动多进程报错:OSError [WinError 87] 参数不正确
解决Windows下multiprocessing的WinError 87参数错误问题
兄弟,这个问题我之前在Windows上用Python多进程的时候也踩过一模一样的坑!咱们先搞清楚为啥会报错,再给你改好代码。
错误原因
Windows系统的multiprocessing模块和Linux不一样——它没有fork机制,创建子进程的时候会重新导入整个主脚本。你原来的代码有两个关键问题:
- 把
func()定义在了multi()函数内部,子进程重新加载脚本时根本访问不到这个函数(因为子进程不会执行multi()); - 把
if __name__ == '__main__':放在了multi()函数里面,这完全没用——主进程调用multi()时进入这个块创建子进程,但子进程加载脚本时__name__不是__main__,导致整个逻辑混乱,最终触发参数错误。
修正后的代码
直接把目标函数移到全局作用域,并且把程序的主入口放在全局的if __name__块里,就搞定了:
from multiprocessing import Process # 把func放在全局作用域,子进程能正常导入访问 def func(): print("hey") def multi(): processes = [] processes.append(Process(target=func)) processes.append(Process(target=func)) for process in processes: process.start() # 主程序入口必须放在全局的这个判断里,避免子进程重复执行代码 if __name__ == '__main__': multi()
额外说明
如果非要在函数内部定义子进程的目标函数,也可以用multiprocessing.Manager配合或者把函数封装成可导入的模块,但最省心的方式还是把目标函数放在全局作用域——毕竟Windows的多进程就是靠导入脚本工作的,子进程必须能找到你指定的target函数才行。
内容的提问来源于stack exchange,提问作者Floxxy
相关产品推荐
相关产品推荐

