2015-11-26 16 views
13

Chcę uruchomić kilka zadań równolegle, a następnie kontynuować po zakończeniu wszystkich zadań. Mam coś podobnegoPoczekaj na zakończenie wszystkich zadań wieloprocesowych przed kontynuowaniem.

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

to działa, ale jestem pewien, że musi być lepszy sposób, aby czekać na wszystkie zadania, aby zakończyć niż iteracji nad nimi ponownie i ponownie, dopóki nie zostaną wykonane.

Odpowiedz

19

Co z tym?

for job in jobs: 
    job.join() 

Blokuje to do zakończenia pierwszego procesu, następnie następnego i tak dalej. Zobacz więcej o join()

+0

Dokładnie tego szukałem, dziękuję :) – Hybrid

+3

Uwaga dla przyszłych wyszukiwarek: To użycie może wskazywać na zadanie, które skorzystałoby z [Pool] (https://docs.python.org/2/library /multiprocessing.html#using-a-pool-of-workers). – kungphu

2

Możesz skorzystać z join. To pozwala poczekać na zakończenie innego procesu.

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

t1.start() 
t2.start() 

t1.join() 
t2.join() 

Można również użyć barrier To działa jak dla wątków, co pozwala określić liczbę procesu chcesz czekać na raz i ta liczba zostanie osiągnięta bariera uwolnić je. Tutaj klient i serwer są traktowani jako spawn jako Process.

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) 

A jeśli chcesz więcej funkcji, takich jak wymiany danych i większą kontrolę przepływu można użyć manager.

Powiązane problemy