2017-03-05 4 views
1

私は長い間、実行中のタスクのいずれかを並列化しようとしています。何らかの理由で、それはちょうど終わらず、永遠にぶら下がっています。Pythonのマルチプロセッシング - なぜ私のプロセスが戻っていないされている/仕上げ?

import multiprocessing as mp 

class PartitionedResult(object): 
    index = 0 
    P = [] 
    def __init__(self, index, P): 
     self.index = index 
     self.P = P   


def longRunningTask(index, output): 
    P = [] 
    for i in range (0, 1000):   
     print(i) 
     P.append(i) 

    print("I'm done!") 
    output.put(PartitionedResult(index, P)) 
    return 

def main(): 
    output = mp.Queue() 
    processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)] 
    for p in processes: 
     p.start() 

    for p in processes: 
     p.join() 

    results = [output.get() for p in processes] 
    print("This never shows up") 



if __name__ == '__main__': 
    main() 

4つのプロセスごとに0〜999の数字が印刷され、「完了しました! results = [output.get() for p in processes]

forループの範囲を狭くして、たとえばrange(0,50)とすると、突然動作します。

ここで問題は何ですか?

編集:私は、Windows 10上のPython 3.4を使用しています、私は2台の異なるコンピュータ上で、削除pycacheでそれを試してみました。

+0

は再現することはできません。投稿されたコードは私のために働いた。 – tdelaney

+0

ああ!それは奇妙だ。私は新しいファイルにコードをコピーして、私はまだ同じ問題を抱えています。私は自分のPCを2回再起動しました。実行しているPythonのバージョンは?私は窓の上のpython 3.4です。 – user66875

+0

私はLinux mint 17.3でpython 3.4です。 – tdelaney

答えて

1

あなたは結果をget() INGのいる前に、あなたはすべてのプロセスにjoin()を呼び出しています。キューのバッファがいっぱいになると、データが根底にあるパイプにフラッシュされたとき、それはブロックすることができます。 join()プロセスが消費者プロセスからブロックされた場合、プロセスはすべてのデータが書き込まれた後に終了するだけなので、デッドロックが発生します。

それは動作するはずですあなたの main()の終わりに参加するコールを移動

def main(): 
    output = mp.Queue() 
    processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)] 

    for p in processes: 
     p.start() 

    results = [output.get() for p in processes] 
    print("This never shows up") 

    for p in processes: 
     p.join() 
関連する問題