Можете ли вы добавить сопрограмму в начало очереди цикла событий? - PullRequest
0 голосов
/ 08 октября 2018

Есть ли способ создать задачу, но чтобы она выполнялась конкретно при следующем запуске задачи в цикле событий?

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

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

1 Ответ

0 голосов
/ 08 октября 2018

Я хочу немедленно выполнить эти запросы асинхронно, а затем вернуть управление задачам, ранее находившимся в цикле.

Нет способа сделать это в текущей асинхронности, где всевыполняемые задачи находятся в неприоритетной очереди .

Но с вышеуказанным требованием возникает более серьезная проблема.Асинхронные задачи потенциально дают управление циклу событий при каждом блокирующем вызове ввода-вывода или, в более общем случае, при каждом await.Поэтому «немедленно» и «асинхронно» не сочетаются друг с другом: по-настоящему асинхронная операция не может быть немедленной, потому что она должна быть приостановлена, а когда она приостановлена, другие задачи продолжатся.

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

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

...