Как в данный момент запустить EventLoop в python36? - PullRequest
1 голос
/ 24 июня 2019

мы все знаем, что в python37 мы получили новый api asyncio.get_running_loop (), который прост в использовании, поэтому нам не нужно явно передавать eventloop при вызове сопрограммы.

Мне интересно, есть ли какой-нибудь подход, который мы можем использовать, чтобы получить тот же эффект в python36?

# which allows us coding conveniently with this api:
import asyncio

async def test():
    print("hello world !")

async def main():
    loop = asyncio.get_running_loop()
    loop.create_task(test())

asyncio.run(main())

1 Ответ

2 голосов
/ 25 июня 2019

В Python 3.6 вы можете использовать asyncio.get_event_loop() для эквивалентного эффекта.

В соответствии с документацией это эквивалентно вызову get_event_loop_policy().get_event_loop(), что в свою очередь задокументировано для возврата "текущего цикла событий" при вызове из сопрограммы.

Другими словами, при вызове из сопрограммы (или из функции, вызванной сопрограммой) нет разницы между get_event_loop и get_running_loop, оба возвращают работающий цикл. Только когда ни один цикл не запущен, get_event_loop() будет продолжать возвращать цикл, связанный с текущим потоком, в то время как get_running_loop() вызовет исключение. Пока вы будете осторожны с вызовом get_event_loop() во время выполнения цикла, он будет эквивалентен get_running_loop().

Обратите внимание, что get_event_loop, возвращающий рабочий цикл при вызове из сопрограммы, является новым для Python 3.6 и 3.5.3 . До этих версий get_event_loop всегда возвращал цикл обработки событий, связанный с текущим потоком, который мог бы отличаться от цикла, который фактически выполняется. Это сделало get_event_loop() принципиально ненадежным и стало причиной того, что старый asyncio мог везде передавать аргумент loop. Подробнее здесь .

...