PEHDOM
как видно, пул из 3-х воркеров разбирает задачи по мере завершения, пока обрабатываеться первый линк, третий завершаеться и сразу берется 4-й, завершаеться второй и сразу береться 5-й, … на момент когда первый воркер обработает 1-й линк два остальных воркера разберут 2,3,4,5 и 6. Ну а под конец , таки да приходиться ждать пока последний воркер не завершит свою работу, pool.join() обязывает. Как видно,под конец все остальные воркеры уже закончили работу, и все ждут пока отработает 7-й.
Добавил число процессов и вывел названия процессов:
from multiprocessing import Pool, Manager
from itertools import repeat
import multiprocessing
import time
from datetime import datetime
def main(link, counter):
proc = multiprocessing.current_process().name
print(datetime.now(), link, ' - start process ' + proc)
if link%3==0:
time.sleep(1)
elif link%2==0:
time.sleep(3)
else:
time.sleep(7)
counter.value += 1
print(datetime.now(), link, ' - end process ' + proc )
if __name__ == '__main__':
manager = Manager()
counter = manager.Value('i', 0)
links = range(100)
m = 10
with Pool(processes=m) as pool:
pool.starmap(main, zip(links, repeat(counter)))
pool.close()
pool.join()
Вот что получается (последние строки вывода):
2019-03-05 12:15:42.737967 80 - end process SpawnPoolWorker-7
2019-03-05 12:15:42.737967 77 - end process SpawnPoolWorker-11
2019-03-05 12:15:42.747933 83 - end process SpawnPoolWorker-9
2019-03-05 12:15:42.756806 89 - end process SpawnPoolWorker-8
2019-03-05 12:15:42.756806 86 - end process SpawnPoolWorker-102019-03-05 12:15:43.655378 90 - end process SpawnPoolWorker-3
2019-03-05 12:15:43.656373 91 - start process SpawnPoolWorker-32019-03-05 12:15:43.664358 93 - end process SpawnPoolWorker-2
2019-03-05 12:15:43.664358 94 - start process SpawnPoolWorker-22019-03-05 12:15:43.672330 96 - end process SpawnPoolWorker-5
2019-03-05 12:15:43.672330 97 - start process SpawnPoolWorker-52019-03-05 12:15:43.687290 99 - end process SpawnPoolWorker-6
2019-03-05 12:15:46.664557 94 - end process SpawnPoolWorker-2
2019-03-05 12:15:46.665335 95 - start process SpawnPoolWorker-22019-03-05 12:15:50.659865 91 - end process SpawnPoolWorker-3
2019-03-05 12:15:50.660652 92 - start process SpawnPoolWorker-32019-03-05 12:15:50.682679 97 - end process SpawnPoolWorker-5
2019-03-05 12:15:50.683591 98 - start process SpawnPoolWorker-52019-03-05 12:15:53.663673 92 - end process SpawnPoolWorker-3
2019-03-05 12:15:53.668612 95 - end process SpawnPoolWorker-2
2019-03-05 12:15:53.684651 98 - end process SpawnPoolWorker-5
Процессы 7, 11, 9, 8, 10 освободились, но после этого они не загружается и по 2 раза используются процессы 2, 3 и 5. Как добиться того, чтобы процессы всё-таки по одному разбирали свободные задачи?