模块在导入之前存在于新进程内,在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有充分的理由这样做?
模块是如何进入子流程的?
答案 0 :(得分:1)
问题是多处理在unix上使用os.fork。因此子流程成为主流程的副本。不知道Fedora会发生什么,但它也不适用于Linux。
似乎没有任何简单的方法来解决它。
答案 1 :(得分:0)
似乎mac实现对输入的处理方式不同。不过,你可以通过实现自己的模块库来破解它,使用:
my_modules['context'] = __import__('uuid')
uuid = my_modules['context']
uuid.UUID(...)
其中context
是您的每个进程。我不知道你为什么要这样做,但这应该有效。