属性错误:模块“asyncio”没有属性“create_task”

问题描述 投票:0回答:2

我正在尝试致电

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

怎么了?


[注意]:

  • Python 3.6
  • Ubuntu 16.04

[更新]:

借用@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())
python python-3.x async-await python-3.6 python-asyncio
2个回答
40
投票

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'))
    # ...
    await task1
    await task2

这适用于 3.6 和 3.7 以及早期版本。

asyncio.ensure_future
也可以工作,但是当您知道自己正在处理协程时,
create_task
更明确,并且是 首选 选项。


-1
投票

我确实喜欢这个

if __name__ == '__main__':
        asyncio.get_event_loop().run_until_complete(scheduled(4))
© www.soinside.com 2019 - 2024. All rights reserved.