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

标签 python parallel-processing

我正在尝试在多个进程上调用一个函数。显而易见的解决方案是 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__ 可以被子进程导入.

更新

在 func 中添加 global 关键字没有帮助——例如:

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

最佳答案

您需要列表 glob_data 由共享内存支持,Multiprocessing 的管理器为您提供:

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

关于具有全局数据的python并行映射(multiprocessing.Pool.map),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911819/

相关文章:

r - 如何将多个变量和函数从全局环境导出到 foreach 循环?

python - 尝试使用谷歌云文本到语音 API 时无效的 JWT

python - Pandas : columns sample based on row value

python - GTK - Python 窗口符号图标颜色问题

c - 如何计算百分比?

language-agnostic - 如何学习多线程并行编程?

python - 索引错误 : list index out of range - cannot reason the logic

coding-style - 这个成语是pythonic吗? (someBool 和 "True Result"或 "False Result")

c++ - 非线程安全环境中的多线程

python - python 中的并行多处理简单示例