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