При использовании многопроцессорности в Python я обычно вижу примеры, где функция join()
вызывается в отдельном цикле, где каждый процесс был фактически создан.
Например, это:
processes = []
for i in range(10):
p = Process(target=my_func)
processes.append(p)
p.start()
for p in processes:
p.join()
является более распространенным, чем это:
processes = []
for i in range(10):
p = Process(target=my_func)
processes.append(p)
p.start()
p.join()
Но из моего понимания join()
он просто говорит сценарию не выходить, пока этот процесс не завершится. Следовательно, не обязательно иметь значение при вызове join()
. Так почему его обычно называют в отдельном цикле?
join()
- операция блокировки.
В первом примере вы запускаете 10 процессов, а затем ожидаете завершения всех процессов. В то же время все процессы выполняются.
Во втором примере вы запускаете один процесс вовремя, и вы ждете окончания, прежде чем запускать другой процесс. В то же время выполняется только один запущенный процесс
Первый пример:
def wait()
time.sleep(1)
# You start 10 processes
for i in range(10):
p = Process(target=wait)
processes.append(p)
p.start()
# One second after all processes can be finished you check them all and finish
for p in processes:
p.join()
Время выполнения всего скрипта может быть около одной секунды.
Второй пример:
for i in range(10):
p = Process(target=wait) # Here you start one process
processes.append(p)
p.start()
p.join() # Here you will have to wait one second before process finished.
Время выполнения всего скрипта может быть около 10 секунд! ,