Веб-версияОткрыть в Telegram

ПостВ асинхронных приложениях есть один не всегда очевидный момент, который приводит к неявным багам - это общие глобальные …

4 мая 2026
P
Python Заметки
В асинхронных приложениях есть один не всегда очевидный момент, который приводит к неявным багам - это общие глобальные объекты. Да, это в целом антипаттерн, но иногда такие объекты действительно нужны и вполне уместны. Например, когда вы завязаны на уже существующем коде и не можете его поменять, но переменную подставлять надо, при этом явно пробросить её не получится. Для этого используется ContexctVar. Случаи бывают разные но я приведу самый понятный пример - логирование. Допустим, мы не можем передать id юзера куда-то внутрь фреймворка, но можем использовать его в своем хендлере подставляя как переменную. В примере будет без хендлера но суть та же. import asyncio from contextvars import ContextVar import random # это переменная, которая будет разной для каждой корутины user_id_ctx = ContextVar("user_id", default=-1) async def handle_request(user_name, user_id): # устанавливаем значение для текущей корутины и её дочерних корутин user_id_ctx.set(user_id) print(f"Create {user_name} == {user_id}") await asyncio.sleep(random.random()) # id не передаётся в вызов await process_order(user_name) async def process_order(user_name): # получаем значение из локального контекста current_user_id = user_id_ctx.get() print(f"Log {user_name}: {current_user_id}") async def main(): await asyncio.gather( *[handle_request(f"user {i}", i) for i in range(10)], ) if __name__ == "__main__": asyncio.run(main()) Во всех выводах id должен совпадать. - Точно так же можно подставлять атрибуты у инстансов синглтонов. - Контекст наследуется дочерними корутинами. - Не стоит увлекаться этим способом, он прилично усложняет логику. Явное лучше неявного. @asyncio @tricks
6 · 912 ·

Рядом в ленте

PPython ЗаметкиНедавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно былPPython ЗаметкиNuitka 4.0 Библиотека для компиляции python-кода в исполняемые файлы получила мажорный апдейт. Ключевые изменения: - ускорение сборки бинарника в 15 раз - экспе
это сообщение
PPython ЗаметкиТеперь аналогичная история с тредами. Для тредов используется объект threading.local. Он позволяет создать локальный динамический атрибут (да, вот так костыльноPPython ЗаметкиМы рассмотрели два способа управления конеткстом переменных. Если вам показалось, что это выглядит излишне и можно было бы оставить один, то вам не показалось.

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем