簡體   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