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

  Рет қаралды 1,523

Python Clinic

Python Clinic

Күн бұрын

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
@Artem36
@Artem36 7 күн бұрын
Привет на 21:28 подразумевается ведь параллельное выполнение?
@pythonclinic
@pythonclinic 7 күн бұрын
в этом примере да, можно назвать параллельным
@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?
@daninspace9009
@daninspace9009 Жыл бұрын
По каким то причинам у меня даже при n=2 всегда разные pid процесса, как будто балансировка не работает. python3.10
@pythonclinic
@pythonclinic Жыл бұрын
так наоборот же сработала) нагрузка распределилась сразу же, первый проц не успел обработать, и подключился второй
@daninspace9009
@daninspace9009 Жыл бұрын
@@pythonclinic проц вроде бы не слабый, удивительно, что не успевает обработать 2 запроса, там где у вас 10 обрабатывает
@pythonclinic
@pythonclinic Жыл бұрын
возможно специфика архитектуры конкретной модели процессора, трудно сказать
@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 Жыл бұрын
я бы посоветовал посмотреть в сторону потоков на самом деле
@AlexandrKalinovsky
@AlexandrKalinovsky Жыл бұрын
Насколько я понимаю, использовать асинхронность в нынешний век быстрых процессоров, по большей части нужно лишь в операциях IO.
@pythonclinic
@pythonclinic Жыл бұрын
помимо IO асинхронность применяется при запросах по http например, или при работе с пользовательским интерфейсом
Потоки в Python
13:26
Python Clinic
Рет қаралды 1 М.
it takes two to tango 💃🏻🕺🏻
00:18
Zach King
Рет қаралды 32 МЛН
1🥺🎉 #thankyou
00:29
はじめしゃちょー(hajime)
Рет қаралды 78 МЛН
New Gadgets! Bycycle 4.0 🚲 #shorts
00:14
BongBee Family
Рет қаралды 12 МЛН
Асинхронность в python
26:23
Python Clinic
Рет қаралды 2,3 М.
Unlocking your CPU cores in Python (multiprocessing)
12:16
mCoding
Рет қаралды 291 М.
Методы классов в Python
10:51
Python Clinic
Рет қаралды 1,1 М.