Пользовательские неблокирующие операции в Python asyncio - PullRequest
0 голосов
/ 28 октября 2018

В настоящее время asyncio Event Loop поддерживает неблокирующую работу с сетевыми сокетами, файлами, подпроцессами и сигналами.Для других операций документация описывает выполнение кода в пулах потоков или процессов , но это выглядит гораздо менее эффективно (потоки против сопрограмм).

Есть ли способ ввести дополнительные low-level неблокирующие операции, например, обертывание вызовов библиотеки ввода-вывода?Какие примитивы должны быть реализованы?

1 Ответ

0 голосов
/ 01 ноября 2018

Как и большинство циклов событий, цикл событий asyncio построен вокруг опроса источников ввода-вывода, файловых дескрипторов в Unix и файловых дескрипторов в Windows. Опрос или select - это операция ввода-вывода, которая эффективно контролирует несколько файловых дескрипторов, приостанавливая текущий поток, пока не произойдет что-то интересное, например, поступление новых данных.При желании опрос принимает тайм-аут, поэтому выполнение может продолжаться, даже если нет нового события ввода-вывода.Более подробное описание темы см. В этом SO-ответе и других ответах на тот же вопрос.

Конструкция на основе опроса позволяет asyncio изначально поддерживать два вида событий:

  • IO возможен
  • истекло время ожидания

Все остальные типы событий должны быть выражены в терминах этих двух.Например, call_soon_threadsafe запускает цикл обработки событий, записывая данные во внутренний канал, отслеживаемый циклом обработки событий.Реализация run_in_executor использует call_soon_threadsafe для информирования asyncio о завершении синхронной функции.

Чтобы подключить совершенно другой механизм опроса к asyncio, обычно создается поток, посвященныйтакой опрос, и используйте call_soon_threadsafe, чтобы сообщить asyncio о новых событиях. Этот ответ , например, показывает, как подключить необработанный многопроцессорный пул (который может быть прерван) к asyncio.

...