web-dev-qa-db-fra.com

AttributeError: le module 'asyncio' n'a pas d'attribut 'create_task'

J'essaie de asyncio.create_task() mais je fais face à cette erreur:

Voici un exemple:

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

En dehors:

AttributeError: module 'asyncio' has no attribute 'create_task'

J'ai donc essayé avec l'extrait de code suivant (.ensure_future()) à la place, sans aucun problème:

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

En dehors:

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

Qu'est-ce qui ne va pas?


[ [~ # ~] note [~ # ~] ]:

  • Python 3.6
  • Ubuntu 16.04

[MISE À JOUR]:

Avec emprunt à @ tilisateur4815162342 Réponse , mon problème résolu:

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())
11
Benyamin Jafari

Le create_task la fonction de niveau supérieur a été ajoutée dans Python 3.7, et vous utilisez Python 3.6. Avant la version 3.7, create_task n'était disponible qu'en tant que méthode sur la boucle d'événement, vous pouvez donc l'invoquer comme ça:

async def main():
    loop = asyncio.get_event_loop()
    task1 = loop.create_task(async_say(4, 'hello'))
    task2 = loop.create_task(async_say(6, 'world'))

Cela fonctionne dans les versions 3.6 et 3.7, ainsi que dans les versions antérieures. asyncio.ensure_future fonctionnera également, mais lorsque vous savez que vous avez affaire à une coroutine, create_task est plus explicite et correspond à l'option préférée .

12
user4815162342