2

multiprocessing.Queue複数のプロセスを並行して処理するプログラムを書いています。オーケストレーションの部分を掘り下げるほど、理解できなくなります。

私が達成したいのは、いくつかのプロセスを開始し、先に進む前にそれらすべてが完了していることを確認することです。これは の仕事のようですね.join()

最終的に、次のデモ スクリプト (Linux で実行) をテストしました。

import multiprocessing
import time

def myproc():
    print("hello from {proc}".format(proc=multiprocessing.current_process()))
    time.sleep(5)

allproc = []
for _ in range(3):
    p = multiprocessing.Process(target=myproc)
    allproc.append(p)
    p.start()

print("all processes started")

for p in allproc:
    print("joining {proc}".format(proc=p))
    p.join()

print("the end")

私が期待したのは、関数が 3 回開始され、すぐに "hello" メッセージが出力されてからスリープすることです。それらすべてがスリープ状態になると、最終メッセージ (「終わり」) が出力されます。

私が実際に得るのはこれです:

hello from <Process(Process-1, started)>
hello from <Process(Process-2, started)>
all processes started
joining <Process(Process-1, started)>
hello from <Process(Process-3, started)>
joining <Process(Process-2, stopped)>
joining <Process(Process-3, stopped)>
the end

スクリプトを実行すると、3 番目の「hello」と 2 番目の「joining」の間で待機します。

上記に従って、期待されるオーケストレーションを実現できるように、マルチプロセッシング コードをどのように設計すればよいですか?

4

1 に答える 1

0

メインスレッドがすべての子プロセスが完了するまで待機する必要がある場合はprint("the end")、上記の説明に従って、コードは正しいです。コードの最後の行の前に右を置くprint len(multiprocessing.active_children())と、それが 0 に等しいことがわかります。

于 2014-12-05T20:33:04.673 に答える