关于python:mac上的多处理导入模块

multiprocessing import modules on mac

在导入之前,模块存在于新进程中,在OSX上使用Python多处理。< BR>例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<wyn>
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()
</wyn>

< BR>在Windows/Linux上的输出是我所期望的。脚本导入两次,uuid.some_变量不存在,并且在导入之前未加载uuid:

1
2
3
4
5
6
7
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。新进程中存在一些_变量:

1
2
3
4
5
6
importing module
main pid 4399
setting var
uuid module loaded: True
process pid 4400
var exists on mac True

不知何故,来自主进程的UUID模块进入子进程,而不导入它。< BR>我错过了什么吗,这是一个bug,还是Mac有充分的理由这样做?< BR>模块是如何进入子流程的?


问题是多处理在Unix上使用os.fork。因此,子流程成为主流程的副本。不知道Fedora发生了什么,但它也不应该在Linux上工作。< BR>似乎没有任何简单的方法来绕过它。


似乎mac实现对导入的处理方式不同。不过,您可以通过实现自己的模块存储库来破解它,方法是:

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

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