web-dev-qa-db-ja.com

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

でる:

_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
_

どうしましたか?


[[〜#〜] note [〜#〜]]:

  • Python 3.6
  • Ubuntu 16.04

[更新]:

から借りて @ ser4815162342 回答 、私の問題は解決しました:

_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

create_task トップレベル関数がPython 3.7で追加され、あなたはPython 3.6。3.7より前のcreate_taskは、イベントループで method としてのみ使用可能であったため、次のように呼び出すことができます。

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はより明示的で、 preferred オプションです。

12
user4815162342