Асинхронность и мультипроцессность для ускорения вычислений в Python
Когда вычисления упираются в потолок, на помощь приходят асинхронность и мультипроцессность.
Темирлан Илик — backend-разработчик в GoDays — объясняет на пальцах, как asyncio и multiprocessing помогают ускорять вычисления в Python.
В докладе: — как устроен асинхронный паттерн: event loop, очередь задач и неблокирующая обработка ввода-вывода — что такое мультипроцессность: процесс на ядро, пулы процессов и нюансы fork (Linux/macOS против Windows) — когда что применять: asyncio для IO-bound задач, multiprocessing — для CPU-bound — объединение обоих подходов через библиотеку aiomultiprocess — практический пример: ускорение ML-инференса на данных из Telegram
Видео
Презентация
1 / 20Текст презентации
Слайд 1: Как асинхрон и мультипроцессность
Как асинхрон и мультипроцессность помогают ускорять вычисления? Примеры и практики
Слайд 2: Введение
Введение Данный документ написан в целях ознакомления с такими понятиями как асинхронность и мультипроцессорность в программировании. Применению asyncio и multiprocessing, а также библиотеки aiomultiprocess, на практике.
Слайд 3: Об о мне
Об о мне Меня зовут Темирлан, мне 20 лет. В коммерческой разработке уже 5 лет. Backend разработчик в GoDays. Студент в МУИТ.
Слайд 4: Async
Async Асинхрон - это шаблон ожидания IO процессов в виде очереди/пула запросов, где каждый запуск функции имеет свой асинхронный контекст и точки IO операций, так он позволяет программе работать в non-blocking режиме. В парадигме Python асинхрон является инструментом для смены паттернов работы функций. Изначально паттерн работы следующий
Слайд 5: Если у нас появляется множество запросов на “Ввод”, тогда
Если у нас появляется множество запросов на “Ввод”, тогда “Вывод” будет осуществляться в том порядке в котором поступали запросы(в порядке очереди). Но при асинхронном паттерне работы будет следующий результат
Слайд 6: Мы закладываем следующий шаблон работы
Мы закладываем следующий шаблон работы: 1.Когда мы получаем запрос, перенаправляем его в Event Loop(Наш обработчик событий/корутин). 2.Выполняем код до точки ожидания и передаем в Process Pool(Наше хранилище задач/фьючерсов). 3.Раз в несколько тиков, выполняются системные вызовы, если такой получили, проходимся по Process Pool и смотрим на точки ожидания, если получили на него ответ выполняем программу. *Для операции вывода идет та же последовательность
Слайд 7: Как видно, при смене паттерна работы функций на асинхронный, мы не
Как видно, при смене паттерна работы функций на асинхронный, мы не ожидаем полного завершения каждого из запросов, а выбираем следующий из запросов на “Ввод”/“Вывод”. Таким образом мы можем существенно ускорить процесс обработки запросов, но никак не скорость их вычисления.
Слайд 8: Что такое мультипроцессность?
Что такое мультипроцессность? Мультипроцессность - это способ запуска приложения, при котором каждый “Процесс” запускается на отдельном ядре процессора. Процесс - это экземпляр приложения со своей выделенной памятью и потоками.
Слайд 9: Если присмотреться можно заметить “Pool” в котором как
Если присмотреться можно заметить “Pool” в котором как раз и запускаются эти процессы, но вопрос как Pool создает эти процессы?
Слайд 10: Так же тут есть подводные камни. Например Windows OS не
Так же тут есть подводные камни. Например Windows OS не могут делать Fork, так делают в основном Linux и MacOS. Fork как бы наследует образ приложения и меня в нем лишь часть кода параметрами и переменными.
Слайд 11: Можно ли их объединять и имеет ли смысл?
Можно ли их объединять и имеет ли смысл?
Слайд 12: Да, можно, да имеет
Да, можно, да имеет • Мы просто записываем всё в едином варианте. Используем Asyncio в задачах с IO-bound и Multiprocessing в CPU-bound. • Применяться оно может в разных направлениях и обстоятельствах, например в ETL процессах или для ML-инференса. • Будем разбирать на примере с библиотекой aiomultiprocess • А так же покажем прирост в ML инференсе. Данный подход можно применять и при обучении модели.
Слайд 13: Примером как раз
Примером как раз можно взять ML-инференс, для большего актуальности применения данных данные будем доставать из telegram. Почему ML-Инфренес и telegram? Это актуально и показывает нагрузку CPU/ GPU и IO bound процессы
Слайд 14: Multiprocessing
Multiprocessing Async Async + Multiprocessing
Слайд 15: ВАЖНО!
ВАЖНО! • Как вы ранее видели логику поражения процессов, вы так же должны знать что всё имеет свою цену, в том числе и стоимость работы в асинхронном режиме и в многопроцессном. А объединяя всё выше указанное вы повышаете себе время изначального запуска на порождение всех этих структур и систем.
Слайд 16: Результаты
Результаты:
Слайд 17: Всё ради этого
Всё ради этого:
Слайд 18: Ссылки
Ссылки GitHub LinkedIn
Слайд 19: Референсы и просто полезные
Референсы и просто полезные источники: • https://www.dataleadsfuture.com/combining-multiprocessing-and-asyncio-in-python-for-performance-boosts/ • https://www.dataleadsfuture.com/supercharge-your-python-asyncio-with-aiomultiprocess-a-comprehensive-guide/ • https://www.dataleadsfuture.com/aiomultiprocess-super-easy-integrate-multiprocessing-asyncio-in-python/ • https://www.dataleadsfuture.com/using-tqdm-with-asyncio-in-python/ • https://medium.com/@yarusl42/asyncio-in-depth-part-1-8457efb4106b • https://habr.com/ru/articles/804799/ • https://medium.com/devopss-hole/python-multiprocessing-pickle-issue-e2d35ccf96a9 • https://medium.com/devopss-hole/python-multiprocessing-pickle-issue-e2d35ccf96a9 • https://huggingface.co/models?pipeline_tag=text-classi cation&sort=trending
Слайд 20: Спасибо за внимание
Спасибо за внимание
Другие доклады митапа
- ДСObservability и OpenTelemetry Дмитрий Стародубов
- АГLLM в продакшне Азамат Галимжанов
- ТКCursor и AI-ассистент в разработке Темирлан Кабылбеков

















