我正在尝试将共享密钥传递给子进程。在Linux环境中,这可行。在Windows环境中,孩子不会收到共享密钥。下面的三个文件是我正在尝试做的一个简单示例:
import multiprocessing
import module1
import module2
if __name__ == "__main__":
module1.init()
process = multiprocessing.Process(target=module2.start)
process.start()
process.join()
import ctypes
import multiprocessing
x = None
def init():
global x
x = multiprocessing.Value(ctypes.c_wchar_p, "asdf")
import module1
def start():
print(module1.x.value)
在Ubuntu 14.04环境中,在Python 3.5上,我收到以下输出:
$ python3 main.py
asdf
在CentOS 7环境中,我收到以下输出:
$ python3 main.py
asdf
在Windows 10上使用Windows子系统Linux(在创建者更新之前和之后,以及Ubuntu 14.04和16.04),我得到以下输出:
$ python3 main.py
asdf
但是,在Windows 7和Windows 10环境中,使用3.5或3.6,我得到AttributeError
而不是上面的输出:
Process Process-1:
Traceback (most recent call last):
File "C:\Python\Python35\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Python\Python35\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "H:\Development\replicate-bug\module2.py", line 5, in start
print(module1.x.value)
AttributeError: 'NoneType' object has no attribute 'value'
我正在使用shared ctype。该值应由子进程继承。
为什么我在Windows环境中收到此AttributeError
,而不是Linux环境?
答案 0 :(得分:3)
如其中一篇帖子automatically linked on the sidebar中所述,Windows在* NIX系统上没有fork
系统调用。
这意味着,不是共享全局状态(如NIX进程可以做到的),Windows子进程基本上是完全独立的。这包括模块。
我怀疑正在发生的事情是模块重新加载,而您在module1
内访问的module2.start
并不是您期望的模块。
multiprocessing guidelines明确提到模块级常量不受规则限制:“变量可能不包含您期望的内容”。在任何一种情况下,解决方案都是明确地将您想要的模块传递给子进程,如下所示:
def start(mod1):
print(mod1.x.value)
if __name__ == '__main__':
module1.init()
process = multiprocessing.Process(target=module2.start, args=(module1,))
process.start()
process.join()