Форум сайта python.su
0
PEHDOM, спасибо. Да, похоже, что они всё-таки не заранее разбирают список для обработки. Наверное у меня проблема в другом. Если проводить аналогию с вашим примером, то у меня получается, что все процессы отработали, а последний выполняет 7, а потом еще и 8. Другие почему-то 8 не забирают во время выполнения 7, хотя свободны. Буду разбираться.
А в ваш 3-й пример с использованием pool.map и manager есть возможность добавить использование Array?
Как это правильно сделать?
Офлайн
0
Разобрался, понял, что через repeat с Array тоже работает.
Офлайн
0
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()
Отредактировано Room_on (Март 5, 2019 11:31:46)
Офлайн
294
Room_onА. ну да, map таки разбивает входящий список на куски(chunks).Размер оно вычисляет исходя из длинны входящего списка( хотя я почемуто считал что у него поумолчанию единица должна стоять, видать невнимательно читал). А чанки потом передает в пул как отдельные задачи, при небольших обьемах этого не видно так как оно устанавливает размер равный 1.
Процессы 7, 11, 9, 8, 10 освободились, но после этого они не загружается и по 2 раза используются процессы 2, 3 и 5. Как добиться того, чтобы процессы всё-таки по одному разбирали свободные задачи?
12:53:33 0 - start process SpawnPoolWorker-2
12:53:33 3 - start process SpawnPoolWorker-3
12:53:33 6 - start process SpawnPoolWorker-4
12:53:33 12 - start process SpawnPoolWorker-11
....
12:54:14 97 - end process SpawnPoolWorker-4
12:54:17 95 - end process SpawnPoolWorker-3
12:54:25 92 - start process SpawnPoolWorker-2
12:54:25 98 - start process SpawnPoolWorker-4
12:54:28 92 - end process SpawnPoolWorker-2
12:54:28 98 - end process SpawnPoolWorker-4
pool.starmap(main, zip(links, repeat(counter)), chunksize=1)
12:46:37 0 - start process SpawnPoolWorker-5
12:46:37 1 - start process SpawnPoolWorker-2
12:46:38 2 - start process SpawnPoolWorker-4
12:46:38 3 - start process SpawnPoolWorker-10
12:46:38 4 - start process SpawnPoolWorker-8
12:46:38 5 - start process SpawnPoolWorker-3
12:46:38 7 - start process SpawnPoolWorker-11
12:46:38 8 - start process SpawnPoolWorker-7
12:46:38 6 - start process SpawnPoolWorker-6
12:46:38 9 - start process SpawnPoolWorker-9
12:46:38 0 - end process SpawnPoolWorker-5
12:46:38 10 - start process SpawnPoolWorker-5
12:46:39 3 - end process SpawnPoolWorker-10
....
12:47:11 79 - end process SpawnPoolWorker-7
12:47:11 98 - start process SpawnPoolWorker-7
12:47:12 96 - end process SpawnPoolWorker-2
12:47:12 99 - start process SpawnPoolWorker-2
12:47:12 92 - end process SpawnPoolWorker-11
12:47:13 99 - end process SpawnPoolWorker-2
12:47:13 94 - end process SpawnPoolWorker-10
12:47:13 83 - end process SpawnPoolWorker-3
12:47:13 85 - end process SpawnPoolWorker-9
12:47:14 98 - end process SpawnPoolWorker-7
12:47:15 89 - end process SpawnPoolWorker-8
12:47:15 91 - end process SpawnPoolWorker-5
12:47:17 95 - end process SpawnPoolWorker-6
12:47:18 97 - end process SpawnPoolWorker-4
[code python][/code]
Отредактировано PEHDOM (Март 5, 2019 13:07:23)
Офлайн