Где вызывать join () при многопроцессорной обработке

1

При использовании многопроцессорности в 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(). Так почему его обычно называют в отдельном цикле?

Теги:
python-multiprocessing

1 ответ

5
Лучший ответ

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 секунд! ,

  • 0
    Хорошо спасибо. Итак, в первом примере, скажем, все процессы выполняются примерно одинаково. Второй цикл будет ждать до завершения первого процесса, а затем очень быстро перебирает все остальные 9 процессов, почти мгновенно?
  • 1
    @ Karnivaurus: верно. Эти процессы будут работать параллельно, и ваше ожидание только для самого длинного одного процесса. Ваше второе решение потребует ожидания каждого процесса подряд.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню