Pool процессов в Python - параллельность и асинхронность

Pool процессов позволяет запускать ограниченное количество процессов в автоматическом режиме, это решение скорее для обработки данных в стиле "включил и забыл", что может не всегда давать какое-то НеВеРоЯтНоЕ преимущество в скорости, но как минимум выполнить в несколько раз больше разных операций за то же время мы сможем легко на любом железе. Плюс есть возможность работать с асинхронностью для ценителей этого дела.
Канал в тг, где я даю немного контекста к видео - t.me/PythonClinicChnl
Таймкоды:
00:00 - интро
00:36 - что такое pool
02:48 - многопроцессный map и балансировка
08:34 - обгоняем стандартный map в 16 раз
12:30 - асинхронность
15:50 - apply_async
23:09 - страшный секрет и аутро

Пікірлер: 18

  • @user-it3yo1sn6i
    @user-it3yo1sn6i Жыл бұрын

    Попробовал. map, если использую 2-4-6-8 процессов, то превзойти скорость обработки одним процессом я так и не смог (используя операцию hash(x)). Заменил операцию на x**2 и при 8 процессах получилось на 40% быстрее чем одним процессом. apply и get на самом деле по умолчанию асинхронные? Я правильно вас понял?

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    мне стоило сделать на этом акцент в самом видео - в моих примерах, если мы используя один процесс обработали 100 числе за 1 секунду, а потом включили пул и мэпом прошли тоже за 1 секунду в 4 потока, то это не значит, что производительность плохая, это значит, что мы за 1 секунду обработали в 4 раза больше данных, везде ведь range(n) передаётся apply и map под капотом асинхронные, при их вызове мы получаем apply_aync().get() и map_async().get() под капотом (рад, что вы досмотрели)))

  • @user-it3yo1sn6i

    @user-it3yo1sn6i

    Жыл бұрын

    @@pythonclinic "apply и map под капотом асинхронные, при их вызове мы получаем apply_aync().get() и map_async().get()" вот это прям совсем было неожиданно. Мир не будет прежним )))

  • @sportsman3109

    @sportsman3109

    11 ай бұрын

    @@pythonclinic Не совсем понял. Когда мы задействуем 4 процесса и используем pool.map(some_func, range(100)) обрабатывается в 4 раза больше данных, то есть 400?

  • @user-ps8nk2sf2h
    @user-ps8nk2sf2h Жыл бұрын

    Почему imap запрашивает из iterable объекта, первые 180 значений в начале программы. Хотя в моем пуле 20 процессов, а в таргет функции я написал sleep(очень много секунд). Я ожидал следующего поведения, запросится 20 значений из iterable, все процессы отработают, начнут запрашивать next(iterable) и.т.д Короче я не понимаю что за кучу значений imap достает заранее, это какой то запас на будущее? Чтоб процессы не проставили ни секунды когда будут готовы получить следующие входные аргументы?

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    всё верно, можно сказать, что это запас на будущее, но вообще вы увидели именно работу очереди задач внутри процесса, в которую как раз и добавились эти значения вместе с целевыми функциями (хоть они и спят в начале)

  • @user-ps8nk2sf2h

    @user-ps8nk2sf2h

    Жыл бұрын

    ​@@pythonclinic А что если генератор будет йаилдить очень большие объекты? Не переполнится ли память от того, что пул пытается запастись на будущее

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    в теории может быть такое, отожрать памяти пул в случае чего действительно сможет знатно (но не до переполнения конечно), но это в том числе цена за параллельность

  • @user-ps8nk2sf2h

    @user-ps8nk2sf2h

    Жыл бұрын

    @@pythonclinic из альтернатив остаётся только применение apply_asinc, с хардкодом контроля количества создаваемых задач для процессов? Мне нужно реализовать обработку очень большого файла, результат обработки нужно писать в другой файл.

  • @pythonclinic

    @pythonclinic

    11 ай бұрын

    я бы посоветовал посмотреть в сторону потоков на самом деле

  • @daninspace9009
    @daninspace9009 Жыл бұрын

    По каким то причинам у меня даже при n=2 всегда разные pid процесса, как будто балансировка не работает. python3.10

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    так наоборот же сработала) нагрузка распределилась сразу же, первый проц не успел обработать, и подключился второй

  • @daninspace9009

    @daninspace9009

    Жыл бұрын

    @@pythonclinic проц вроде бы не слабый, удивительно, что не успевает обработать 2 запроса, там где у вас 10 обрабатывает

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    возможно специфика архитектуры конкретной модели процессора, трудно сказать

  • @Artem36
    @Artem3615 сағат бұрын

    Привет на 21:28 подразумевается ведь параллельное выполнение?

  • @pythonclinic

    @pythonclinic

    Сағат бұрын

    в этом примере да, можно назвать параллельным

  • @AlexandrKalinovsky
    @AlexandrKalinovsky Жыл бұрын

    Насколько я понимаю, использовать асинхронность в нынешний век быстрых процессоров, по большей части нужно лишь в операциях IO.

  • @pythonclinic

    @pythonclinic

    Жыл бұрын

    помимо IO асинхронность применяется при запросах по http например, или при работе с пользовательским интерфейсом