在Mac上导入multiprocessing模块

2 投票
2 回答
907 浏览
提问于 2025-04-16 20:48

在使用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上也应该不会正常工作。
看起来没有简单的方法可以解决这个问题。

撰写回答