8

次のように、プロセス間で辞書を共有したいと考えています。

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 は {} を返します。どうすればそれを機能させることができますか?

ありがとう、

4

1 に答える 1

15

これは、multiprocessingモジュールを使用しているようです。あなたは言わなかった、そしてそれは重要な情報だ。

インスタンスの.map()関数はmultiprocessing.Pool()、関数とシーケンスの2つの引数を取ります。関数は、シーケンスからの連続した値で呼び出されます。

コードは複数の異なるプロセスで実行されるため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

于 2012-06-14T00:03:42.050 に答える