Event loop кооперативно переключает задачи, когда они приостанавливаются на await. Синхронный долгий код в его потоке блокирует остальные задачи независимо от наличия async def.
Как работает event loop в asyncio и как GIL влияет на выполнение синхронного кода? В каких задачах asyncio даёт существенный прирост производительности, а где оказывается бесполезен или вреден?
Event loop кооперативно переключает задачи, когда они приостанавливаются на await. Синхронный долгий код в его потоке блокирует остальные задачи независимо от наличия async def.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Event loop кооперативно переключает задачи, когда они приостанавливаются на await. Синхронный долгий код в его потоке блокирует остальные задачи независимо от наличия async def.
Asyncio полезен при множестве сетевых ожиданий и подходящих неблокирующих клиентах: пока один запрос ждёт, выполняется другой. CPU-цикл без точек передачи управления не ускоряется и увеличивает задержки всех соединений. GIL в обычном CPython дополнительно ограничивает параллельное исполнение Python-кода потоками, но блокировка event loop — отдельная проблема. Блокирующий I/O выносят в thread pool, тяжёлые вычисления — в процессы или иной вычислительный контур. Ограничивают конкурентность и очереди: миллионы бесконтрольных задач тоже расходуют память.