Цифровое искусство NFT

Асинхронность в Python: задумка, которая ставит нас не на тот путь

Цифровое искусство NFT
Python async: a step in the wrong direction

Разбор проблем и ограничений асинхронного программирования в Python, а также взгляд на альтернативные подходы к конкурентному выполнению задач с упором на опыт gevent и Go. .

Асинхронное программирование в Python изначально было встречено с большим энтузиазмом, ведь оно обещало решить многие проблемы, связанные с обработкой параллельных задач и облегчилo работу с сетью. Однако за годы использования стало ясно, что этот путь далеко не идеален и порождает свои собственные сложности. Многие эксперты сегодня утверждают, что использование async и await - шаг в неверном направлении, особенно с точки зрения дизайна языка и удобства разработчиков. Основная идея асинхронности - возможность не блокировать выполнение кода при ожидании ввода-вывода, позволяя одновременно выполнять множество операций. В Python это реализовано через библиотеку asyncio и ключевые слова async и await, которые управляют событиями в специальном цикле обработки событий (event loop).

Но практика показала много ограничений. Например, асинхронность эффективно работает с сетевыми операциями, однако файловый ввод-вывод пока полностью не поддерживается в таком формате. Это значит, что многие задачи все равно приходится выполнять с использованием стандартных синхронных операций или подключать дополнительные потоки. Проблема усугубляется тем, что многие действия, хоть и не блокируют глобальную блокировку интерпретатора (GIL), все равно препятствуют работе цикла событий. Таким образом, многопоточность зачастую оказывается более удобным и надежным вариантом, а асинхронный код требует тщательного внимания, чтобы случайно не заблокировать цикл событий.

Разработчикам приходится поддерживать две параллельные экосистемы API - для синхронных и асинхронных вызовов, что усложняет поддержку и развитие проектов. Еще одна важная проблема - так называемый "эффект окрашивания функций" (function coloring). При добавлении конструкции async функции становятся асинхронными, что приводит к необходимости выделять таковыми и вызывающие их функции. Это превращается в цепную реакцию, когда необходимо переписывать все больше и больше кода, чтобы поддержать единую логику. Для крупных проектов это становится настоящим камнем преткновения и препятствует постепенному внедрению асинхронности.

 

Когда мы смотрим на другие языки программирования, становится очевидно, что альтернативные подходы к конкуренции предлагают более удобные и менее болезненные модели. Примером является язык Go, который применяет концепцию горутин - легковесных потоков, планируемых на уровне языка и runtime, без необходимости помечать функции специальными ключевыми словами. Проведение конкурентных операций в Go превращается в простое добавление ключевого слова go перед вызовом функции, при этом сама функция остается обычной. Это снимает большую часть возни с функциями и позволяет писать понятный и лаконичный код. Идей в основе Go лежат два важных инсайта.

 

Во-первых, runtime обеспечивает кооперативное планирование задач с автоматическим возвратом управления планировщику при блокирующих операциях. Это устраняет необходимость указывать явные точки переключения или аннотации async, что снимает проблему окрашивания кода. Во-вторых, решение о том, запускать функцию параллельно или нет, принимается не в объявлении функции, а в точке вызова, что дает программисту большую гибкость. Возвращаясь к Python, стоит отметить, что язык далеко не нов, и после много лет развития он оказался ограничен в возможностях глубокой интеграции асинхронного подхода в ядро интерпретатора. Однако одним из немногих проектов, который попытался компенсировать это - библиотека gevent.

 

Она базируется на зеленых потоках - легковесных кооперативных потоках, реализованных через специальный механизм greenlet. Одно из главных достоинств gevent - автоматическое "монкипатчинг" (замена) стандартных блокирующих вызовов библиотеки, что превращает большинство синхронных вызовов в не блокирующие и позволяет значительно облегчить код. Использование gevent дает возможность писать код, который выглядит как обычный синхронный, но при этом имеет высокую производительность и простоту параллелизма, близкие к Go. Однако широкое распространение этой модели ограничено тем, что придется отказаться от привычных моделей API и преодолеть сопротивление разработчиков, опасающихся последствий monkey patching. Еще одним важным существующим трендом становится идея структурированной конкуренции - концепция, которая гарантирует, что параллельные задачи не выйдут за пределы их родительского контекста.

Это облегчает управление временем жизни задач, их отменой, обработкой ошибок и освобождением ресурсов. В Python для работы с этим используются библиотеки AnyIO и Trio, которые реализуют эти подходы поверх уже существующих асинхронных фреймворков, улучшая управляемость и читаемость кода. Структурированная конкуренция делает код более очевидным, удобным для отладки и менее подверженным ошибкам, связанным с утечками или бесконтрольным выполнением задач. При этом она применима как к async, так и к зеленым потокам, потокам операционной системы и даже подходам с multiprocessing. Таким образом, будущее за концепциями, которые обеспечивают большую абстракцию и автоматизацию жизненного цикла параллельных задач, делая моделирование конкуренции проще и безопаснее.

Перспективы развития Python-модели конкуренции связаны с усиленным уклоном в сторону зеленых потоков. Подобно Go, где runtime управляет планированием легковесных потоков, возможно, со временем появятся решения, которые позволят создавать экологию безопасного многопоточного исполнения без глобальной блокировки интерпретатора. В таком сценарии многие текущие ограничения async будут устранены естественным образом. В заключение, хотя добавление async/await в Python сыграло важную роль в развитии языка и позволило избежать хаоса коллбэков, на практике оно породило ряд сложностей, которые пока не были устранены. Альтернативы вроде gevent с его зеленым нитями, а также концепции структурированной конкуренции, предлагают привлекательные пути вперед.

Они делают параллелизм и асинхронность более прозрачными и менее болезненными для разработчиков. Python стоит на пороге новых решений, которые смогут объединить простоту и мощь в одном флаконе, максимально сократив разрыв между синхронным и асинхронным кодом. Развитие таких подходов может вернуть Python к логичной, удобной и эффективной модели конкурентного программирования, способной удовлетворить запросы современных приложений и разработчиков. .

Автоматическая торговля на криптовалютных биржах

Далее
Google's Wire is no longer maintained
Пятница, 02 Январь 2026 Почему Google Wire больше не поддерживается и что это значит для пользователей

Обзор причин прекращения поддержки Google Wire, анализ последствий для пользователей и альтернативы современным мессенджерам в условиях развивающегося рынка коммуникаций. .

Looking back at Steve Jobs's NeXT, Inc – the most successful failure
Пятница, 02 Январь 2026 NeXT от Стива Джобса: самый успешный провал в истории технологий

История компании NeXT, основанной Стивом Джобсом после ухода из Apple, существенно повлияла на развитие компьютерных технологий и вернула Джобса обратно в Apple. История о том, как провал стал фундаментом для будущих успехов.

Go channels to solve interface impedance mismatch
Пятница, 02 Январь 2026 Использование Go-каналов для решения проблемы несовместимости интерфейсов

Подробное объяснение того, как каналы в языке Go помогают устранить несоответствие между различными интерфейсами, приводя к эффективной и производительной реализации итераторов в сложных системах, таких как базы данных .

Device enabling dogs to form sentences
Пятница, 02 Январь 2026 Устройство, позволяющее собакам формировать предложения: революция в общении с питомцами

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

Polymarket Integrates Chainlink to Automate Prediction Market Settlements
Пятница, 02 Январь 2026 Polymarket и Chainlink: новая эра автоматизации расчетов в децентрализованных прогнозных рынках

Инновационное партнерство Polymarket и Chainlink открывает путь к быстрым, надежным и безопасным расчетам в децентрализованных прогнозных платформах с использованием оракулов и блокчейн-технологий. .

Is Arch Capital Group Stock Underperforming the Nasdaq?
Пятница, 02 Январь 2026 Анализ акций Arch Capital Group: Отстаёт ли компания от индекса Nasdaq?

Обзор динамики акций Arch Capital Group в сравнении с индексом Nasdaq, анализ финансовых показателей компании и перспективы инвестирования в 2025 году. .

Chewy’s Post-Earnings Stock Drop Is More Bark Than Bite. Buy It
Пятница, 02 Январь 2026 Акции Chewy после отчетности: шум вокруг падения стоит ли бояться и почему стоит покупать

После публикации финансовых результатов акции Chewy пережили снижение, вызвавшее обеспокоенность инвесторов. Однако тщательный анализ свидетельствует, что это падение - скорее мимолетное явление, а перспективы компании остаются устойчивыми, что делает ее привлекательной для долгосрочных инвестиций.