首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么` `await asyncio.create_task()`的行为与将其赋值给变量时有所不同?

为什么` `await asyncio.create_task()`的行为与将其赋值给变量时有所不同?
EN

Stack Overflow用户
提问于 2020-01-13 02:37:38
回答 1查看 169关注 0票数 0

为什么在下面的代码中,任务1-3和任务4-6的运行方式会有所不同?

代码:

代码语言:javascript
复制
import asyncio


async def do_something(i, sleep):  # No I/O here
    print("Doing... ", end="")
    print(await no_io_1(i, sleep))


async def no_io_1(i, sleep):  # No I/O here
    return await no_io_2(i, sleep)


async def no_io_2(i, sleep):  # No I/O here
    return await io(i, sleep)


async def io(i, sleep):
    await asyncio.sleep(sleep)  # Finally some I/O
    # t = asyncio.create_task(asyncio.sleep(sleep))
    # await t
    return i


async def main():
    await asyncio.create_task(do_something(1, sleep=4))
    await asyncio.create_task(do_something(2, sleep=3))
    await asyncio.create_task(do_something(3, sleep=2))

    t4 = asyncio.create_task(do_something(4, sleep=4))
    t5 = asyncio.create_task(do_something(5, sleep=3))
    t6 = asyncio.create_task(do_something(6, sleep=2))
    await t4
    await t5
    await t6

asyncio.run(main())
print("\r\nBye!")

输出:

代码语言:javascript
复制
Doing... 1
Doing... 2
Doing... 3
Doing... Doing... Doing... 6
5
4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-13 02:49:26

在第一个代码片段中,您将立即等待您创建的每个任务。结果,任务被阻止并行运行。

在第二个代码片段中,您创建了三个任务,然后才开始等待。这允许这三个函数并行运行,尽管您await指定您对第一个函数的结果感兴趣。(能够在等待特定任务的结果的同时运行其他任务,这是asyncio等库的核心设计目标。)

换句话说,await t1并不意味着“运行t1",它意味着”挂起我并旋转事件循环,直到t1完成“。不同之处与存储在变量中的任务无关,而是一次性创建任务。例如,您可以像这样修改第二个示例:

代码语言:javascript
复制
    t4 = asyncio.create_task(do_something(4, sleep=4))
    await t4
    t5 = asyncio.create_task(do_something(5, sleep=3))
    await t5
    t6 = asyncio.create_task(do_something(6, sleep=2))
    await t6

...and,你会得到类似于第一个例子的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59706978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档