Asyncio не запускает запланированное задание любым из множества возможных способов - PullRequest
0 голосов
/ 11 марта 2020

Вот как выглядит мой базовый код

def heavylifting(self):
  # Do the heavy lifting
  print('Done!')

async def async_heavylifting(self):
  await self.heavylifting()

Вот несколько способов, которые не работают:

Пример 1 - ничего не происходит.

def do_the_things(self):
  loop = asyncio.new_event_loop()
  asyncio.set_event_loop(loop)
  asyncio.run_coroutine_threadsafe(self.async_heavylifting(), loop)

Example2 - Выдает событие без события l oop error

def do_the_things(self):
  loop = asyncio.new_event_loop()
  asyncio.set_event_loop(loop)
  asyncio.create_task(self.async_heavylifting())

Example3 - Ничего не происходит

def do_the_things(self):
  loop = asyncio.new_event_loop()
  asyncio.set_event_loop(loop)
  loop.create_task(self.async_heavylifting())

Пример 4 - Не запускать и забывать. Блокировка при тяжелом подъеме вызова

def do_the_things(self):
  loop = asyncio.new_event_loop()
  asyncio.set_event_loop(loop)
  loop.run_in_executor(None, self.heavylifting())

Что я делаю не так? Как заставить мою функцию работать?

Примечание. Я хочу добиться того, чтобы функция «забыл и забыл» при вызове функции тяжелой атлетики. Я не хочу ждать его до конца sh

1 Ответ

0 голосов
/ 13 марта 2020

Ваши примеры терпят неудачу, потому что вы не НАЧИНАЛИ событие l oop. Есть несколько способов сделать это, самый простой из которых:

asyncio.run(coro)

, который создаст событие l oop, запустит сопрограмму и вернет результат.

Другие методы:

loop.run_until_complete(future)

Метод события l oop. Он запускает l oop и останавливает его снова, когда будущее завершено.

loop.run_forever()

Другое событие l oop метод. Начинает событие l oop. Это будет продолжаться до тех пор, пока не будет вызвана l oop .stop ().

Получение события l oop и его запуск - два разных шага. По моему опыту, вызов функции set_event_l oop необходим, только если вы запускаете циклы в нескольких потоках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...