模块在导入之前存在于新进程中,在 osx 上使用 python-multiprocessing。
下面是一个例子:
import multiprocessing
import sys
import os
print 'importing module'
def main():
import uuid
print 'setting var'
uuid.some_variable = True
def process(name):
print 'uuid module loaded:', 'uuid' in sys.modules
print 'process pid', os.getpid()
import uuid
var = uuid.some_variable
print 'var exists on mac', var
if __name__ == '__main__':
print 'main pid', os.getpid()
main()
p = multiprocessing.Process(target=process, args=('test',))
p.start()
p.join()
Windows/Linux 上的输出是我所期望的。脚本导入两次,uuid.some_variable不存在,导入前未加载uuid:
importing module main pid 4352 setting var importing module uuid module loaded: False process pid 4988 AttributeError: 'module' object has no attribute 'some_variable'
但是在osx上,脚本只会import一次,uuid是import前加载的,uuid.some_variable存在于新进程中:
importing module main pid 4399 setting var uuid module loaded: True process pid 4400 var exists on mac True
不知何故,来自主进程的 uuid 模块进入了子进程,而没有导入它。
我错过了什么,这是一个错误,还是 mac 有充分的理由这样做?
模块是如何进入子进程的?
请您参考如下方法:
问题是 multiprocessing 在 unix 上使用 os.fork。所以子进程成为主进程的副本。不知道 Fedora 是怎么回事,但它也不应该在 linux 上运行。
似乎没有任何简单的方法来解决它。
