AttributeError: модуль 'asyncio' не имеет атрибута 'create_task' - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь 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())

Из:

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())

Из:

started at 13:19:44
hello
world
finished at 13:19:50

[UPDATE]:

С заимствованиями у @ пользователя 4815162342 ответа , я обновил свой вопрос:

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())

Что не так?


[ Примечание ]:

  • Python 3,6
  • Ubuntu 16.04

1 Ответ

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

Функция верхнего уровня 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 является более явным и является предпочтительным предпочтительным вариантом.

...