python-3.x create_task之后没有等待时会发生什么

bvjveswy  于 2023-03-20  发布在  Python
关注(0)|答案(1)|浏览(120)

我正在尝试理解asyncio,我对任务很困惑。具体来说,我知道当当前的协程被挂起并且控制权被传递给事件循环时,一个任务将运行。如果在一个任务被创建后,wait从未被调用,并且协程刚刚退出,那该怎么办?
例如

import asyncio

async def print_stuff(s):
    print(s)

async def print_wrapper(s):
    print(f"{s}: create task")
    asyncio.create_task(print_stuff(s))
    print(f"{s}: sleeping")
    print(f"{s}: ending coroutine")

async def sleep_wrapper(s):
    print(f"{s}: before sleep")
    await asyncio.sleep(2)
    print(f"{s}: after sleep")

async def main():
    asyncio.create_task(print_stuff("stuff"))
    asyncio.create_task(print_wrapper("wrapper"))
    asyncio.create_task(sleep_wrapper("abc"))

asyncio.run(main())
print("after main")

输出为

stuff
wrapper: create task
wrapper: sleeping
wrapper: ending coroutine
abc: before sleep
after main

我不明白的是
1.为什么我会看到任务的输出,在main结束之后,事件循环不应该以它结束吗?
1.为什么“ Package 器”和“abc:“睡后”没有打印而其他信息打印了

fjaof16o

fjaof16o1#

我简要地看了一下asyncio源代码,我认为事件循环进行了一次循环(或者两次?)迭代,然后返回,因为停止条件(完成main)为真。
开始时有4个任务,3个在main中创建,第4个是main协程本身。在一个循环迭代中,每个就绪的任务运行一个“步骤”,即从开始的新任务,从上一步完成的点开始执行其他任务。“步骤”总是在任务不能继续的点结束,或者是相应协程的结束(return或在最后一条指令或异常之后)或不能立即返回值的await。在第一种情况下,任务变为“完成”。在后一种情况下任务变为未就绪并等待某个未决的future值。当将来变为“完成”时,相关的任务可以被安排再次运行。2在你的代码中,它是“步骤”结束的睡眠。

相关问题