Python在并行进程之间共享字典

Ami*_*mir 6 python multiprocessing

我想在我的进程之间共享一个字典,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

y返回{}.我怎样才能使它工作?

谢谢,

ste*_*eha 11

这看起来像您正在使用该multiprocessing模块.你没有说,这是一个重要的信息.

实例.map()上的函数multiprocessing.Pool()有两个参数:一个函数和一个序列.将使用序列中的连续值调用该函数.你试图通过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))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

如果您有多个序列,并且需要将它们连接在一起以构建上述序列,请查看使用zip()或者可能itertools.product.