Skip to main content
 首页 » 编程设计

python之mac 上的多处理导入模块

2025年05月04日8daizhj

模块在导入之前存在于新进程中,在 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上,脚本只会import一次,uuid是import前加载的,uuid.some_variable存在于新进程中:

importing module 
main pid 4399 
setting var 
uuid module loaded: True 
process pid 4400 
var exists on mac True 

不知何故,来自主进程的 uuid 模块进入了子进程,而没有导入它。
我错过了什么,这是一个错误,还是 mac 有充分的理由这样做?
模块是如何进入子进程的?

请您参考如下方法:

问题是 multiprocessing 在 unix 上使用 os.fork。所以子进程成为主进程的副本。不知道 Fedora 是怎么回事,但它也不应该在 linux 上运行。
似乎没有任何简单的方法来解决它。