web-dev-qa-db-fra.com

Attendez la fin de tous les travaux de multitraitement avant de continuer

Je veux exécuter un tas de tâches en parallèle, puis continuer une fois toutes les tâches terminées. J'ai quelque chose comme

# 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 ***')

cela fonctionne, mais je suis sûr qu'il doit y avoir une meilleure façon d'attendre la fin de tous les travaux que de les répéter encore et encore jusqu'à ce qu'ils soient terminés.

26
Hybrid

Qu'en est-il de?

for job in jobs:
    job.join()

Cela bloque jusqu'à ce que le premier processus se termine, puis le suivant et ainsi de suite. En savoir plus sur join()

35
jayant

Vous pouvez utiliser join . Il vous permet d'attendre la fin d'un autre processus.

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

t1.start()
t2.start()

t1.join()
t2.join()

Vous pouvez également utiliser barrière Cela fonctionne comme pour les threads, vous permettant de spécifier un certain nombre de processus que vous souhaitez attendre et une fois ce nombre atteint, la barrière les libère. Ici, le client et le serveur sont supposés être générés en tant que processus.

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)

Et si vous voulez plus de fonctionnalités comme le partage de données et plus de contrôle de flux, vous pouvez utiliser un manager .

5
Rbtnk