2017-02-15 21 views
1

私は、プロセス間でキューを共有するために、ワーカーのプールとマネージャを使用して、Python 2.7でマルチプロセス再帰アルゴリズムをコーディングしようとしています。コードをすべてのアルゴリズムの詳細をストライピングPython再帰アルゴリズムのマルチプロセス

は、次の1のようになります。

from functools import partial 
from multiprocessing import Pool, Manager 

def pulse(l, c, accOut, v): 
    print l, c, v 
    if c < 3: 
     c = c + 1 
     l.append((v,c)) 
     pulse(l, c, accOut, v) 
    else:   
     accOut.put(l) 
     return 

if __name__ == "__main__": 
    pool = Pool(processes=1) 
    manager = Manager() 
    accOut = manager.Queue() 
    lNodes = manager.list(range(1, 7)) 
    partialCall = partial(pulse, list(), 0, accOut) 
    pool.map(partialCall, lNodes) 
    pool.close() 
    pool.join() 
    print "--- Lists in the queue: " 
    while not accOut.empty(): 
     print accOut.get() 

私はsakeof簡単にするためにプールで唯一の労働者を使用しています。それはより多くの労働者と同じですが、より厄介です。 私はこの1つのような出力が期待:私は理解していない

[] 0 1 
[(1, 1)] 1 1 
[(1, 1), (1, 2)] 2 1 
[(1, 1), (1, 2), (1, 3)] 3 1 
[(1, 1), (1, 2), (1, 3)] 0 2 
[(1, 1), (1, 2), (1, 3), (2, 1)] 1 2 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2)] 2 2 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)] 3 2 
[] 0 3 
[(3, 1)] 1 3 
[(3, 1), (3, 2)] 2 3 
[(3, 1), (3, 2), (3, 3)] 3 3 
[(3, 1), (3, 2), (3, 3)] 0 4 
[(3, 1), (3, 2), (3, 3), (4, 1)] 1 4 
[(3, 1), (3, 2), (3, 3), (4, 1), (4, 2)] 2 4 
[(3, 1), (3, 2), (3, 3), (4, 1), (4, 2), (4, 3)] 3 4 
[] 0 5 
[(5, 1)] 1 5 
[(5, 1), (5, 2)] 2 5 
[(5, 1), (5, 2), (5, 3)] 3 5 
[(5, 1), (5, 2), (5, 3)] 0 6 
[(5, 1), (5, 2), (5, 3), (6, 1)] 1 6 
[(5, 1), (5, 2), (5, 3), (6, 1), (6, 2)] 2 6 
[(5, 1), (5, 2), (5, 3), (6, 1), (6, 2), (6, 3)] 3 6 
--- Lists in the queue: 
[(1, 1), (1, 2), (1, 3)] 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)] 
[(3, 1), (3, 2), (3, 3)] 
[(3, 1), (3, 2), (3, 3), (4, 1), (4, 2), (4, 3)] 
[(5, 1), (5, 2), (5, 3)] 
[(5, 1), (5, 2), (5, 3), (6, 1), (6, 2), (6, 3)] 

[] 0 1 
[(1, 1)] 1 1 
[(1, 1), (1, 2)] 2 1 
[(1, 1), (1, 2), (1, 3)] 3 1 
[] 0 2 
[(2, 1)] 1 2 
[(2, 1), (2, 2)] 2 2 
[(2, 1), (2, 2), (2, 3)] 3 2 
[] 0 3 
[(3, 1)] 1 3 
[(3, 1), (3, 2)] 2 3 
[(3, 1), (3, 2), (3, 3)] 3 3 
[] 0 4 
[(4, 1)] 1 4 
[(4, 1), (4, 2)] 2 4 
[(4, 1), (4, 2), (4, 3)] 3 4 
[] 0 5 
[(5, 1)] 1 5 
[(5, 1), (5, 2)] 2 5 
[(5, 1), (5, 2), (5, 3)] 3 5 
[] 0 6 
[(6, 1)] 1 6 
[(6, 1), (6, 2)] 2 6 
[(6, 1), (6, 2), (6, 3)] 3 6 
--- Lists in the queue: 
[(1, 1), (1, 2), (1, 3)] 
[(2, 1), (2, 2), (2, 3)] 
[(3, 1), (3, 2), (3, 3)] 
[(4, 1), (4, 2), (4, 3)] 
[(5, 1), (5, 2), (5, 3)] 
[(6, 1), (6, 2), (6, 3)] 

をする代わりに、私はこのような何かを得ます。なぜこの出力?私は間違って何をしていますか?なぜ、パルス関数がv = 2で呼び出されても、新しいリストを入力として受け取らないのですか?部分的な関数のリストを別の方法で渡すべきですか?

私は簡単にパルス関数の第1の呼び出しでリストlをリセットする期待される結果を得ることができますが、私はそれがきれいではないと思うし、それを行う別の方法が必要です。

私はWindows 10 64ビットで作業していますが、Pythonのバージョンを変更することはできません。 私はすでにソリューションをオンラインで探していますが、何も見つかりませんでした。

ご協力いただければ幸いです。

+0

あなたの代わりにCをお使いの変数のために話す名前を使用した場合にあなたのコードを約推論する方が簡単かもしれません、 vおよびl。 – MKesper

+1

これがhttp://docs.python-guide.org/en/latest/writing/gotchas/である必要があるかどうかは不明ですが、関連するものである可能性があります。関数に 'None'を渡してチェックするだけで' l is None'なら新しいリストを作ることをお勧めします。 – Adirio

+0

@MKesper私は同意します。私の誓い:「l」は「list」を表し、「c」は「count」を表し、「v」は「value」を表します。 – Adirio

答えて

0

マルチプロセッシングモジュールまたはfunctoolsモジュールは何らかのバッチ処理を実行しており、同一の変更可能なlistインスタンスを2回の別のコール(link)に送信しています。このビアビウールを対応するエンティティに通知するために、より深い検査を実施すべきである。一方、引数としてNoneを使用し、最初のpulse反復でlistのインスタンスを生成します。

from functools import partial 
from multiprocessing import Pool, Manager 

def pulse(l, c, accOut, v): 
    if l is None: 
     l = [] 
    print l, c, v 
    if c < 3: 
     c = c + 1 
     l.append((v,c)) 
     pulse(l, c, accOut, v) 
    else:   
     accOut.put(l) 
     return 

if __name__ == "__main__": 
    pool = Pool(processes=1) 
    manager = Manager() 
    accOut = manager.Queue() 
    lNodes = manager.list(range(1, 7)) 
    partialCall = partial(pulse, None, 0, accOut) 
    pool.map(partialCall, lNodes) 
    pool.close() 
    pool.join() 
    print "--- Lists in the queue: " 
    while not accOut.empty(): 
     print accOut.get() 

あなたが実際にそれらのいくつかには、デフォルトの値を指定する引数の順序を入れ替えるすることもできます。

from functools import partial 
from multiprocessing import Pool, Manager 

def pulse(accOut, v, l=None, c=0): 
    if l is None: 
     l = [] 
    print l, c, v 
    if c < 3: 
     c = c + 1 
     l.append((v,c)) 
     pulse(accOut, v, l, c) 
    else:   
     accOut.put(l) 
     return 

if __name__ == "__main__": 
    pool = Pool(processes=1) 
    manager = Manager() 
    accOut = manager.Queue() 
    lNodes = manager.list(range(1, 7)) 
    partialCall = partial(pulse, accOut) 
    pool.map(partialCall, lNodes) 
    pool.close() 
    pool.join() 
    print "--- Lists in the queue: " 
    while not accOut.empty(): 
     print accOut.get() 
関連する問題