带有全局数据的python并行映射(multiprocessing.Pool.map)

2024-01-12

我正在尝试在多个进程上调用一个函数。显而易见的解决方案是 python 的multiprocessing模块。问题是该函数有副作用。它创建一个临时文件并注册该文件以在退出时删除atexit.register和全球列表。下面应该演示这个问题(在不同的上下文中)。

import multiprocessing as multi

glob_data=[]
def func(a):
    glob_data.append(a)

map(func,range(10))
print glob_data  #[0,1,2,3,4 ... , 9]  Good.

p=multi.Pool(processes=8)
p.map(func,range(80))

print glob_data  #[0,1,2,3,4, ... , 9] Bad, glob_data wasn't updated.

有什么办法可以更新全局数据吗?

请注意,如果您尝试上面的脚本,您可能不应该从交互式解释器中尝试它,因为multiprocessing需要模块__main__可被子进程导入。

UPDATE

添加了globalfunc 中的关键字没有帮助——例如:

def func(a):  #Still doesn't work.
    global glob_data
    glob_data.append(a)

你需要清单glob_data为了得到共享内存的支持,多处理管理器可以为您提供:

import multiprocessing as multi
from multiprocessing import Manager

manager = Manager()

glob_data = manager.list([])

def func(a):
    glob_data.append(a)

map(func,range(10))
print glob_data  # [0,1,2,3,4 ... , 9] Good.

p = multi.Pool(processes=8)
p.map(func,range(80))

print glob_data # Super Good.

对于一些背景:

https://docs.python.org/3/library/multiprocessing.html#managers https://docs.python.org/3/library/multiprocessing.html#managers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有全局数据的python并行映射(multiprocessing.Pool.map) 的相关文章

随机推荐