2012-06-13 54 views
5

我想分享我的过程之间的字典如下之间的字典:Python的共享并行处理

def f(y,x): 
    y[x]=[x*x]               

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = range(10) 
    y={}        
    result = pool.map(f,y,inputs) 

的Y返回{}。我怎样才能使它工作?

感谢,

+1

这听起来像Redis的工作! –

+0

什么是Redis? – Amir

+2

http://www.google.com/search?q=redis –

回答

9

这就像你正在使用的multiprocessing模块。你没有说,这是一个重要的信息。

multiprocessing.Pool()实例上的.map()函数有两个参数:函数和序列。该函数将使用序列中的连续值调用。您正试图通过y和一个序列,并且不起作用。

你可以像这样做一个序列:((y, x) for x in input),然后编写一个函数,它接受一个参数,一个元组,然后用它做正确的事情。

我只使用multiprocessing.Pool()来运行读取和写入磁盘文件的进程,所以我不确定这里的基本思路是如何工作的:我不确定你是否可以像你正在尝试的那样改变字典。

我建议只将值从函数中传回来,然后收集它们以获得最终结果。我只是测试此代码,它的工作原理:

import multiprocessing as mp 

def f(x): 
    return (x, x*x) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    result = dict(pool.map(f, inputs)) 

result设置为:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

让我们改变它,这样,而不是计算x*x它会提高x一些权力,将提供一种动力。让我们把它作为一个字符串的关键参数。这意味着f()需要采用元组参数,其中元组将为(key, x, p),并且它将计算x**p

import multiprocessing as mp 

def f(tup): 
    key, x, p = tup # unpack tuple into variables 
    return (key, x**p) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)] 
    result = dict(pool.map(f, inputs)) 

如果您有多个序列,你需要加入他们的行列,共同作出上述单个序列,考虑使用zip()或许itertools.product

+0

如何向f添加一个参数?我做了def f(x,i):....然后pool.map(f,inputs,1),但python不喜欢它。它返回f()只需要2个参数 – Amir

+1

'pool.map()'接受一个函数和一个序列。序列可以是一系列元组或列表,这就是你将如何传递附加参数。我会再添加一个例子。 – steveha

+1

如果您真的想在进程之间共享字典,请查看多处理模块中的Manager.dict。 – danielm