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(...) |
其中