Python mac上的多处理导入模块

Python mac上的多处理导入模块,python,macos,multiprocessing,Python,Macos,Multiprocessing,模块在导入之前存在于新进程中,在osx上使用python多处理 下面是一个例子: 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:', 'uu

模块在导入之前存在于新进程中,在osx上使用python多处理
下面是一个例子:


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_变量不存在,并且在导入之前未加载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' 导入模块 主pid 4352 设定值 导入模块 加载的uuid模块:False 过程pid 4988 AttributeError:“模块”对象没有属性“某些变量” 但是在osx上,脚本只导入一次,在导入之前加载uuid,并且uuid.some_变量存在于新进程中:

importing module main pid 4399 setting var uuid module loaded: True process pid 4400 var exists on mac True 导入模块 主pid 4399 设定值 加载的uuid模块:True 过程pid 4400 在mac上存在var True 不知何故,主进程的uuid模块进入子进程,而不导入它
我是否遗漏了什么,这是一个bug,还是mac有很好的理由这么做

模块是如何进入子流程的

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

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

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

问题是多处理在unix上使用os.fork。因此,子进程成为主进程的副本。我不知道Fedora是怎么回事,但它也不应该在linux上工作

在Arch Linux上使用Python 2.7(以及使用
2to3
后的Python 3.2)运行您的确切代码时,我得到了“uuid模块加载:True”和“mac上存在var True”。你能告诉我你在Linux和MacOS上使用的是哪个版本的Python吗?@Schnouki:都是Python 2.6。Windows 7、Fedora 11、OSX 10.6.6。你得到的结果是我不想要的。我需要每个进程自己导入模块。