在Mac上导入multiprocessing模块
在使用python的多进程功能时,模块在新进程中会存在于导入之前,这种情况在mac系统上会出现。
这里有一个例子:
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'
但是在mac上,脚本只会导入一次,uuid在导入之前就已经被加载了,并且在新进程中uuid.some_variable是存在的:
importing module main pid 4399 setting var uuid module loaded: True process pid 4400 var exists on mac True
不知怎么的,主进程中的uuid模块在没有导入的情况下就进入了子进程。
我是不是漏掉了什么?这是个bug吗?还是说mac有合理的原因这样做?
这个模块是怎么进入子进程的呢?
2 个回答
0
看起来在Mac上处理导入的方式有点不同。不过,你可以通过自己建立一个模块库来解决这个问题,使用:
my_modules['context'] = __import__('uuid')
uuid = my_modules['context']
uuid.UUID(...)
这里的context
指的是你每一个进程。我不太清楚你为什么想这么做,但这样应该是可行的。
1
问题在于,使用多进程时,Unix系统会用os.fork这个命令。这样一来,子进程就变成了主进程的一个复制品。我不太清楚Fedora系统的情况,但在Linux上也应该不会正常工作。
看起来没有简单的方法可以解决这个问题。