首页 > 试题广场 >

分析以下 asyncio 代码片段,并预测其终端输出内容的正

[单选题]
分析以下 asyncio 代码片段,并预测其终端输出内容的正确顺序。
import asyncio
async def my_task(name, delay):
    print(f"Task {name}: starting")
    await asyncio.sleep(delay)
    print(f"Task {name}: finished")
async def main():
    print("Main: creating tasks")
    task1 = asyncio.create_task(my_task("A", 1))
    task2 = asyncio.create_task(my_task("B", 0.5))
    print("Main: tasks created")
    await task1
    await task2
    print("Main: finished")
asyncio.run(main())
  • Main: creating tasks → Main: tasks created → Task A: starting → Task B: starting → Task B: finished → Task A: finished → Main: finished
  • Main: creating tasks → Task A: starting → Task B: starting → Main: tasks created → Task B: finished → Task A: finished → Main: finished
  • Main: creating tasks → Main: tasks created → Task B: starting → Task A: starting → Task A: finished → Task B: finished → Main: finished
  • Main: creating tasks → Main: tasks created → Task A: starting → Task B: starting → Task A: finished → Task B: finished → Main: finished
感觉稍微有点难以理解,研究了下,此题考查asyncio异步编程。

执行主函数,首先输出"Main: creating tasks",然后创建了AB两个任务(注意此时只是创建了任务,未执行),此时输出"Main: tasks created",在事件循环队列里面添加好了AB任务。

捕捉到异步编程的关键词await,【此时主协程把控制权让给事件循环,事件循环发现有两个可以执行的任务,它选择一个任务开始执行(通常是先创建的任务,即任务A)】。

任务A打印"Task A: starting",然后遇到await asyncio.sleep(1),任务A暂停并交回控制权给事件循环。

事件循环获得控制权后,发现还有B任务可以执行,于是执行B任务,任务B打印"Task B: starting",然后遇到await asyncio.sleep(0.5),任务B也暂停。

现在两个任务都在等待各自的睡眠时间结束。事件循环会监控这些异步操作的完成情况。

大约0.5秒后,任务B的睡眠先结束,事件循环恢复任务B的执行,任务B从暂停处继续,打印"Task B: finished"并完成。

大约1秒后,任务A的睡眠结束,事件循环恢复任务A的执行,任务A从暂停处继续,打印"Task A: finished"并完成。

主协程(main)在await task1处的等待条件满足,事件循环恢复主协程的执行。主协程继续执行await task2(但task2早已完成,所以立即通过),最后打印"Main: finished"。

综上顺序为:
Main: creating tasks → Main: tasks created → Task A: starting → Task B: starting → Task B: finished → Task A: finished → Main: finished


发表于 今天 17:36:41 回复(0)