Зачем вызывать метод join() после получения результатов?

Я видел этот код, опубликованный где-то, и мне было трудно понять, как он может работать должным образом

out_q = Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []

for i in range(nprocs):
    p = multiprocessing.Process(
            target=worker,
            args=(nums[chunksize * i:chunksize * (i + 1)],
                  out_q))
    procs.append(p)
    p.start()

# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict = {}
for i in range(nprocs):
    resultdict.update(out_q.get())

time.sleep(5)

# Wait for all worker processes to finish
for p in procs:
    p.join()

print resultdict

time.sleep(15)

Мне кажется, что было бы целесообразно дождаться завершения всех процессов, прежде чем запрашивать очередь на их вывод. Как можно быть уверенным, что при запросе очереди сразу после запуска всех процессов очередь будет содержать все выходные данные? (т.е. что произойдет, если время, затрачиваемое на выполнение работником, будет относительно больше, чем количество времени, которое требуется для запуска всех процессов и последующего просмотра очереди)

Еще один слегка связанный вопрос: в документации Python сказано, что "к процессу можно присоединяться много раз". Почему кто-то хочет присоединиться к процессу несколько раз? Если он уже завершен, какова будет цель проверки его повторного завершения?

1 ответ

Решение

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

Правда, так работает.

Как можно быть уверенным, что при запросе очереди сразу после запуска всех процессов очередь будет содержать все выходные данные?

Он будет ждать, пока не сработает последний процесс.

Почему кто-то хочет присоединиться к процессу несколько раз?

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

Другие вопросы по тегам