mac上的多处理导入模块

时间:2011-07-04 15:52:33

标签: python macos multiprocessing

模块在导入之前存在于新进程内,在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上,脚本只导入一次,导入前加载uuid,新进程中存在uuid.some_variable:

importing module
main pid 4399
setting var
uuid module loaded: True
process pid 4400
var exists on mac True

不知何故,主进程的uuid模块进入子进程,而不进行导入。
我错过了什么,这是一个错误,还是mac有充分的理由这样做?
模块是如何进入子流程的?

2 个答案:

答案 0 :(得分:1)

问题是多处理在unix上使用os.fork。因此子流程成为主流程的副本。不知道Fedora会发生什么,但它也不适用于Linux。
似乎没有任何简单的方法来解决它。

答案 1 :(得分:0)

似乎mac实现对输入的处理方式不同。不过,你可以通过实现自己的模块库来破解它,使用:

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

其中context是您的每个进程。我不知道你为什么要这样做,但这应该有效。

相关问题