2015-11-26 7 views
13

Я хочу запустить параллельную параллельную работу и продолжить работу после завершения всех заданий. У меня есть что-то вродеПодождите, пока все задания многопроцессорности не закончатся, прежде чем продолжить.

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

это работает, но я уверен, что должен быть лучший способ, чтобы ждать, пока все рабочие места, чтобы закончить, чем снова и снова итерацию над ними, пока они не сделали.

ответ

19

А что?

for job in jobs: 
    job.join() 

Это блокирует до завершения первого процесса, затем следующего и так далее. Узнать больше о join()

+0

Это именно то, что я искал, спасибо :) – Hybrid

+3

Примечание для будущих искателей: это использование может указывать на задачу, которая выиграет от [Пул] (https://docs.python.org/2/library /multiprocessing.html#using-a-pool-of-workers). – kungphu

2

Вы можете использовать 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.

Смежные вопросы