Как установить таймаут на выполнение одной корутины?
Ограничить ожидание корутины можно через await asyncio.waitfor(coro(), timeout=5). В Python 3.11+ доступен также контекстный менеджер asyncio.timeout(5).
Читать ответПодготовка к интервью
Разбирайте реальные вопросы, сверяйтесь с подробными ответами и готовьтесь по технологиям и компаниям.
Проверьте, насколько резюме подходит выбранной позиции, и получите рекомендации по улучшению.
Каталог
Ограничить ожидание корутины можно через await asyncio.waitfor(coro(), timeout=5). В Python 3.11+ доступен также контекстный менеджер asyncio.timeout(5).
Читать ответВ asyncio корутины кооперативно делят поток event loop: задача выполняется до приостановки, после чего цикл может продвинуть другие готовые задачи или дождаться событий I/O.
Читать ответawait coroutine выполняет корутину в текущей задаче и ждёт её результата. createtask создаёт отдельную Task, позволяя ей продвигаться конкурентно с другими задачами event loop.
Читать ответСинхронный requests можно выполнить в рабочем потоке, чтобы не занимать event loop. Сам запрос при этом остаётся блокирующим для этого потока.
Читать ответАсинхронный timeout ждёт завершения задачи до дедлайна, затем запрашивает отмену и корректно освобождает ресурсы. Это кооперативная отмена, а не принудительное завершение потока.
Читать ответtime.sleep и синхронный requests блокируют поток event loop. Таймер asyncio.waitfor не сможет вовремя обработать отмену, поэтому такой timeout не гарантирует остановку по настенным часам.
Читать ответБлокирующая для event loop операция долго не возвращает ему управление. Это бывает не только при I/O: построение списка из миллиарда элементов также занимает поток и огромный объём памяти.
Читать ответaiohttp интегрирован с event loop и отдаёт управление на ожидании сетевого I/O. requests предоставляет синхронный интерфейс и удерживает вызывающий поток до завершения операции.
Читать ответ