Ответ 1
Как насчет?
for job in jobs:
job.join()
Это блокируется до завершения первого процесса, затем следующего и так далее. Подробнее о join()
Я хочу запускать кучу заданий параллельно, а затем продолжить, как только все задания будут завершены. У меня есть что-то вроде
# 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 ***')
он работает, но я уверен, что должен быть лучший способ дождаться завершения всех заданий, чем повторять их снова и снова, пока они не будут выполнены.
Как насчет?
for job in jobs:
job.join()
Это блокируется до завершения первого процесса, затем следующего и так далее. Подробнее о join()
Вы можете использовать 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.