【发布时间】:2020-06-27 21:51:20
【问题描述】:
我正在创建一个在 Windows PC 上运行的程序,但我在使用多处理模块时遇到了一些问题。
假设我们运行以下代码:
import multiprocessing as mp
def f():
print('f running')
def main():
p = mp.Process(target=f)
p.start()
print('test print')
if __name__ == '__main__':
main()
如果我在 MacOS 上运行它,我会得到预期的结果:
test print
f running
如果我在 Windows 上运行它,我会得到:
test print
test print
f running
我知道这种行为是因为 python 为每个新进程导入整个文件,但是有没有办法让它像在 MacOS 中一样?
谢谢!
编辑:
在我的程序中,我在文件顶部定义了一些永远不会更改的全局变量,但是当进程启动并导入文件时,这些全局变量会被刷新并获得新值,这是一个问题。
在 if name ==... 中创建这些全局变量适用于 MacOS,但不适用于 Windows。在 MacOS 上,我无论如何都不需要这样做。
import multiprocessing as mp
def f():
print(v)
print('f running')
def main():
p = mp.Process(target=f)
p.start()
print('test print')
if __name__ == '__main__':
v = 'a variable'
main()
MacOS 上的输出:
test print
a variable
f running
Windows 上的输出:
test print
test print
Process Process-1:
Traceback (most recent call last):
File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 313, in _bootstrap
self.run()
File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\ixg21219\Desktop\MP_test\test.py", line 4, in f
print(v)
NameError: name 'v' is not defined
【问题讨论】:
-
我认为 Windows 用户必须做一些事情
freeze_support()jiggery-pokery。 -
在 Windows 上
mp.processes 是通过导入主脚本运行的,因此每次发生这种情况时都会执行模块级别的任何内容(除了在脚本本身启动时运行) — 这就是为什么需要if __name__ == '__main__':保护来防止不希望的递归的原因。请参阅文档中 Contexts and start methods 部分中的 spawn 和 fork。
标签: python windows macos multiprocessing python-import