Найти - Пользователи
Полная версия: Глобальные переменные и multiprocessing
Начало » Python для новичков » Глобальные переменные и multiprocessing
1 2
Room_on
PEHDOM, спасибо. Да, похоже, что они всё-таки не заранее разбирают список для обработки. Наверное у меня проблема в другом. Если проводить аналогию с вашим примером, то у меня получается, что все процессы отработали, а последний выполняет 7, а потом еще и 8. Другие почему-то 8 не забирают во время выполнения 7, хотя свободны. Буду разбираться.

А в ваш 3-й пример с использованием pool.map и manager есть возможность добавить использование Array?
Как это правильно сделать?
Room_on
Разобрался, понял, что через repeat с Array тоже работает.
Room_on
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-10

2019-03-05 12:15:43.655378 90 - end process SpawnPoolWorker-3
2019-03-05 12:15:43.656373 91 - start process SpawnPoolWorker-3
2019-03-05 12:15:43.664358 93 - end process SpawnPoolWorker-2
2019-03-05 12:15:43.664358 94 - start process SpawnPoolWorker-2
2019-03-05 12:15:43.672330 96 - end process SpawnPoolWorker-5
2019-03-05 12:15:43.672330 97 - start process SpawnPoolWorker-5
2019-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-2
2019-03-05 12:15:50.659865 91 - end process SpawnPoolWorker-3
2019-03-05 12:15:50.660652 92 - start process SpawnPoolWorker-3
2019-03-05 12:15:50.682679 97 - end process SpawnPoolWorker-5
2019-03-05 12:15:50.683591 98 - start process SpawnPoolWorker-5
2019-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. Как добиться того, чтобы процессы всё-таки по одному разбирали свободные задачи?
PEHDOM
Room_on
Процессы 7, 11, 9, 8, 10 освободились, но после этого они не загружается и по 2 раза используются процессы 2, 3 и 5. Как добиться того, чтобы процессы всё-таки по одному разбирали свободные задачи?
А. ну да, map таки разбивает входящий список на куски(chunks).Размер оно вычисляет исходя из длинны входящего списка( хотя я почемуто считал что у него поумолчанию единица должна стоять, видать невнимательно читал). А чанки потом передает в пул как отдельные задачи, при небольших обьемах этого не видно так как оно устанавливает размер равный 1.
А на больших входных данных мы можем наблюдать что воркеры берут элементы списка не по порядку:
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
Но размер этих “кусков” можно установить самому используя аргумент chunksize.
вот в такой реализации:
 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

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB