2012-03-28 8 views
51

multiprocessingモジュールのドキュメントには、multiprocessing.Processで始まるプロセスにキューを渡す方法が示されています。しかし、どのようにしてapply_asyncで始まる非同期ワーカープロセスとキューを共有できますか?私は、動的結合や何か他のものは必要ありません。従業員が(繰り返し)結果をベースに戻すための方法です。 RuntimeError: Queue objects should only be shared between processes through inheritance複数のプロセス間で結果キューを共有する

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    q = multiprocessing.Queue() 
    workers = pool.apply_async(worker, (33, q)) 

これがで失敗します。 私はこれが何を意味しているのかを理解しています。酸洗い(またはすべての特別なWindowsの制限事項)を必要とするのではなく、継承することを理解しています。しかし、どのようにdo私は動作するようにキューを渡す?私は例を見つけることができません、私は様々な方法で失敗したいくつかの選択肢を試しました。助けてください?

答えて

73

multiprocessing.Managerを使用してキューを管理し、異なるワーカーがアクセスできるようにしてください。

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    m = multiprocessing.Manager() 
    q = m.Queue() 
    workers = pool.apply_async(worker, (33, q)) 
+0

これは、ありがとう!私の元のコードで非同期呼び出しに無関係な問題がありましたので、私はあなたの答えにも修正をコピーしました。 – alexis

関連する問題