Как и большинство циклов событий, цикл событий asyncio построен вокруг опроса источников ввода-вывода, файловых дескрипторов в Unix и файловых дескрипторов в Windows. Опрос или select - это операция ввода-вывода, которая эффективно контролирует несколько файловых дескрипторов, приостанавливая текущий поток, пока не произойдет что-то интересное, например, поступление новых данных.При желании опрос принимает тайм-аут, поэтому выполнение может продолжаться, даже если нет нового события ввода-вывода.Более подробное описание темы см. В этом SO-ответе и других ответах на тот же вопрос.
Конструкция на основе опроса позволяет asyncio изначально поддерживать два вида событий:
- IO возможен
- истекло время ожидания
Все остальные типы событий должны быть выражены в терминах этих двух.Например, call_soon_threadsafe
запускает цикл обработки событий, записывая данные во внутренний канал, отслеживаемый циклом обработки событий.Реализация run_in_executor
использует call_soon_threadsafe
для информирования asyncio о завершении синхронной функции.
Чтобы подключить совершенно другой механизм опроса к asyncio, обычно создается поток, посвященныйтакой опрос, и используйте call_soon_threadsafe
, чтобы сообщить asyncio о новых событиях. Этот ответ , например, показывает, как подключить необработанный многопроцессорный пул (который может быть прерван) к asyncio.