2011-07-04 48 views
2

在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有一个很好的理由来做到这一点?
模块是如何进入子进程的?

+0

在Arch Linux(使用'2to3'后的Python 3.2)上运行Python 2.7的精确代码时,我得到了“uuid module loaded:True”和“var exists on mac True”。你能告诉你在Linux和MacOS上使用哪个版本的Python? – Schnouki

+0

@Schnouki:它都是python 2.6。 Windows 7,Fedora 11,OSX 10.6.6。 你得到的结果是我不想要的。我需要每个进程自己导入模块。 –

回答

1

问题是多处理在unix上使用os.fork。所以子进程成为主进程的副本。不知道Fedora发生了什么,但它不应该在Linux上工作。
似乎没有任何简单的方法来解决它。

0

看来,mac实现对待不同的进口。不过,你可以通过实现自己的模块库,使用本事:

my_modules['context'] = __import__('uuid') 
uuid = my_modules['context'] 
uuid.UUID(...) 

其中context是你的过程中的每一个。我不知道你为什么想这样做,但这应该起作用。