繁体   English   中英

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

[英]Python sharing a dictionary between parallel processes

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

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 返回 {}。 我怎样才能让它工作?

谢谢,

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

multiprocessing.Pool()实例上的.map()函数有两个参数:一个函数和一个序列。 将使用序列中的连续值调用该函数。

您不能在像dict这样的可变变量中收集值(在示例中,它是参数y ),因为您的代码将在多个不同的进程中运行。 将值写入另一个进程中的dict不会将该值发送回原始进程。 但是如果你使用Pool.map()其他进程将返回每个函数调用的结果,回到第一个进程。 然后你可以收集这些值来构建一个dict

示例代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM