Zen of Python
18.9K subscribers
1.4K photos
203 videos
38 files
3.58K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
asyncio учат до первого исключения внутри задачи, а дальше начинается импровизация

Асинхронный код в проекте обычно дорастает до пары корутин и gather, а всё, что дальше, каждый достраивает по памяти: где ловить ошибку из задачи, упавшей молча, чем связывать корутины, кроме передачи результата в аргументах.

У Real Python есть разбор asyncio целиком, от корутин до выбора задач под них. Что в нём помимо привычного async/await:
• чем asyncio REPL (python -m asyncio) удобнее обёртки asyncio.run вокруг каждого эксперимента;
• как корутины стыкуются через asyncio.Queue, а не через цепочку await;
• что происходит с исключением, которое всплыло внутри задачи;
• в каких задачах asyncio выигрывает, а в каких только добавляет слой.

Открывать стоит ради последних двух пунктов: остальное вы, скорее всего, уже пишете руками.

#python
Media is too big
VIEW IN TELEGRAM
Ко Дню программиста AvitoTech приготовил кое-что особенное!

Совместно со студией FU2RE и 3D-художником Dmitriev Video команда запустила большой портал в прошлое — эмулятор 2006 года будущего разработчика. Внутри олдскульные игры и викторины, за прохождение которых начисляются баллы, поднимающие позицию в рейтинге.

15 сентября трёх лучших игроков ждёт суперпак настоящих разрабов: салфетка на монитор из коллаборации с Elnik, плед, сумка и плюшевый талисман — кот Б/У. Так что успеть сыграть ещё можно!

P. S. А в канале AvitoTech до 13 сентября каждый день выходили праздничные посты. Присмотритесь, возможно, подарки спрятаны и в них 😉
👏1
Как вызывать асинхронный Python из синхронного кода

Если оборачивать каждый вызов в asyncio.run(), Python каждый раз создаёт и закрывает цикл событий. Для одиночного запуска это нормально, но между вызовами не сохранятся привязанные к циклу ресурсы, например aiohttp.ClientSession с пулом соединений.

С Python 3.11 asyncio.Runner позволяет выполнять несколько корутин в одном цикле. Однако пока цикл занят, синхронная часть приложения ждёт. Следующий шаг: перенести цикл в отдельный поток и передавать ему корутины из обычных функций.

В подробном разборе автор собирает ThreadRunner, который запускает корутины и превращает асинхронные итераторы в обычные. Получается точечный мост для существующего синхронного приложения без переписывания всей цепочки в async def.