在osx上使用python-multiprocessing进行导入前,模块存在于新进程中。
下面是一个例子:Windows/Linux上
mac上的多处理导入模块
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()
输出正是我所期望的。该脚本导入了两次,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,该脚本将只导入一次,UUID是进口之前加载,并uuid.some_variable存在在新的过程:
importing module main pid 4399 setting var uuid module loaded: True process pid 4400 var exists on mac True
不知何故,从主过程中的UUID模块进入子流程,不导入它。
我是否错过了一些东西,这是一个bug,还是mac有一个很好的理由来做到这一点?
模块是如何进入子进程的?
在Arch Linux(使用'2to3'后的Python 3.2)上运行Python 2.7的精确代码时,我得到了“uuid module loaded:True”和“var exists on mac True”。你能告诉你在Linux和MacOS上使用哪个版本的Python? – Schnouki
@Schnouki:它都是python 2.6。 Windows 7,Fedora 11,OSX 10.6.6。 你得到的结果是我不想要的。我需要每个进程自己导入模块。 –