[英]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.