web-dev-qa-db-ja.com

続行する前に、すべてのマルチプロセッシングジョブが完了するのを待ちます

一連のジョブを並行して実行し、すべてのジョブが終了したら続行します。私は次のようなものを持っています

# based on example code from https://pymotw.com/2/multiprocessing/basics.html
import multiprocessing
import random
import time

def worker(num):
    """A job that runs for a random amount of time between 5 and 10 seconds."""
    time.sleep(random.randrange(5,11))
    print('Worker:' + str(num) + ' finished')
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    # Iterate through the list of jobs and remove one that are finished, checking every second.
    while len(jobs) > 0:
        jobs = [job for job in jobs if job.is_alive()]
        time.sleep(1)

    print('*** All jobs finished ***')

それは機能しますが、すべてのジョブが完了するまで待機するよりも、完了するまで何度も繰り返し処理するよりも良い方法があるはずです。

26
Hybrid

どう?

_for job in jobs:
    job.join()
_

これは、最初のプロセスが終了するまでブロックされ、次のプロセスが終了するまで続きます。 join() の詳細を参照してください

35
jayant

join を使用できます。別のプロセスが終了するのを待つことができます。

t1 = Process(target=f, args=(x,))
t2 = Process(target=f, args=('bob',))

t1.start()
t2.start()

t1.join()
t2.join()

barrier を使用することもできます。スレッドと同様に機能し、待機するプロセスの数を指定できます。この数に達すると、バリアに到達してプロセスを解放します。ここでは、クライアントとサーバーはプロセスとして生成されると想定されています。

b = Barrier(2, timeout=5)

def server():
    start_server()
    b.wait()
    while True:
        connection = accept_connection()
        process_server_connection(connection)

def client():
    b.wait()
    while True:
        connection = make_connection()
        process_client_connection(connection)

データの共有やフロー制御などの機能が必要な場合は、 manager を使用できます。

5
Rbtnk