Python mac上的多处理导入模块
模块在导入之前存在于新进程中,在osx上使用python多处理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
下面是一个例子:
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。你得到的结果是我不想要的。我需要每个进程自己导入模块。