2015-11-26 14 views
13

Voglio eseguire una serie di lavori in parallelo e quindi continuare una volta che tutti i lavori sono terminati. Ho qualcosa di simileAttendi che tutti i processi di multiprocesso finiscano prima di continuare

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

funziona, ma sono sicuro che ci deve essere un modo migliore per aspettare che tutti i lavori per finire di iterazione di nuovo e di nuovo fino a quando hanno finito.

risposta

19

Che dire?

for job in jobs: 
    job.join() 

Questo blocca fino al termine del primo processo, quindi il successivo e così via. Per ulteriori informazioni su join()

+0

Questo è esattamente quello che stavo cercando, grazie :) – Hybrid

+3

Nota per i futuri utenti: questo utilizzo può essere indicativo di un'attività che potrebbe beneficiare di un [Pool] (https://docs.python.org/2/library /multiprocessing.html#using-a-pool-of-workers). – kungphu

2

È possibile utilizzare join. Ti permette di aspettare che un altro processo finisca.

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

t1.start() 
t2.start() 

t1.join() 
t2.join() 

È inoltre possibile utilizzare barrier Funziona come per i thread, che ti permette di specificare una serie di processo che si desidera attendere e una volta che viene raggiunto questo numero la barriera liberarli. Qui client e server sono sottoposti a spawn come 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) 

E se volete più funzionalità come la condivisione dei dati e un maggiore controllo del flusso è possibile utilizzare un manager.

Problemi correlati