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

mgi*_*son 12 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.
Run Code Online (Sandbox Code Playgroud)

有没有办法更新全球数据?

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

UPDATE

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

def func(a):  #Still doesn't work.
    global glob_data
    glob_data.append(a)
Run Code Online (Sandbox Code Playgroud)

Raf*_*ira 20

您需要列表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.
Run Code Online (Sandbox Code Playgroud)

对于某些背景(搜索经理):

http://docs.python.org/library/multiprocessing.html