2012-02-13 9 views
6

私はPythonのドキュメントに正しく従っていると思いますが、私が探している結果を得るのに問題があります。私は基本的に数字のリストを持っており、それはネストされたforループの関数に渡され、出力は辞書に保存されます。ここでマルチプロセッシングで共有辞書にアクセスするにはどうすればよいですか?

コードです:私が間違ってやっているの

{1: 9801, 2: 9801, 3: 9801, 10: 9801} 

任意の提案:

from multiprocessing import Pool, Manager 

list = [1,2,3,10] 
dictionary = {} 
def test(x, dictionary): 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 



if __name__ == '__main__': 
    pool = Pool(processes=4) 
    mgr = Manager() 
    d = mgr.dict() 
    for N in list: 
     pool.apply_async(test, (N, d)) 

    # Mark pool as closed -- no more tasks can be added. 
    pool.close() 

    # Wait for tasks to exit 
    pool.join() 

    # Output results 
    print d 

ここで期待される結果はですか?また、私は共有リソースが最良のアプローチ(状態を維持するためにデータベースを使用することを考えている)であると確信していないので、私のアプローチに完全に欠陥がある場合や、Pythonでこれを行うより良い方法がある場合はお知らせください。

答えて

3

変更へtestの定義:

def test(x, d): 
    for xx in range(100): 
     for xxx in range(100): 
      d[x]=xx*xxx 

は、そうでなければあなただけの(同期せずに)いくつかのグローバルdictionaryをインクリメントしているし、後でそれをアクセスすることはありません。


一般的なアプローチとしては、特にこの共有者は共有された辞書に多くの競合があると思います。 本当には、すぐにそれを各プロセスから更新する必要がありますか?各プロセスで部分的な結果のバッチを累積し、しばらくして共有オブジェクトを更新するだけで、より良い結果が得られます。

+0

ありがとう、私はこのような単純な間違いをしたとは信じられません。ありがとう。一般的なアプローチとして。私の実際のコードは、基本的に既存のdictアイテムを参照する必要があり、それを作成するために存在しない場合(および新しいループ内でそれを処理するために存在する場合)それを一括して処理することは、具体的には機能しませんが、そのアプローチについて知っておくとよいでしょう。私はデータベースについて考えていた(または結果をファイルに保存していた)が、わからなかった。 – Lostsoul

関連する問題