AttributeError: модуль 'asyncio' не имеет атрибута 'create_task'
Я пытаюсь asyncio.create_task()
, но я имею дело с этой ошибкой:
Вот пример:
import asyncio
import time
async def async_say(delay, msg):
await asyncio.sleep(delay)
print(msg)
async def main():
task1 = asyncio.create_task(async_say(4, 'hello'))
task2 = asyncio.create_task(async_say(6, 'world'))
print(f"started at {time.strftime('%X')}")
await task1
await task2
print(f"finished at {time.strftime('%X')}")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Out:
AttributeError: module 'asyncio' has no attribute 'create_task'
Поэтому я без проблем попытался использовать следующий фрагмент кода (.ensure_future()
):
async def main():
task1 = asyncio.ensure_future(async_say(4, 'hello'))
task2 = asyncio.ensure_future(async_say(6, 'world'))
print(f"started at {time.strftime('%X')}")
await task1
await task2
print(f"finished at {time.strftime('%X')}")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Out:
started at 13:19:44
hello
world
finished at 13:19:50
Что не так?
[Примечание]:
[ОБНОВЛЕНИЕ]:
С помощью заимствования у @user4815162342 Ответ моя проблема решена:
async def main():
loop = asyncio.get_event_loop()
task1 = loop.create_task(async_say(4, 'hello'))
task2 = loop.create_task(async_say(6, 'world'))
print(f"started at {time.strftime('%X')}")
await task1
await task2
print(f"finished at {time.strftime('%X')}")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Ответы
Ответ 1
Функция верхнего уровня create_task
была добавлена в Python 3.7, и вы используете Python 3.6. До 3.7 create_task
был доступен только как метод в цикле событий, так что вы можете вызвать его так:
async def main():
loop = asyncio.get_event_loop()
task1 = loop.create_task(async_say(4, 'hello'))
task2 = loop.create_task(async_say(6, 'world'))
Это работает как в 3.6 и 3.7, так и в более ранних версиях. asyncio.ensure_future
также будет работать, но когда вы знаете, что имеете дело с сопрограммой, create_task
является более явным и является предпочтительным вариантом.