Python asyncio获取性能收益是否必须手动调用create_task?框架会自动处理吗
结论验证
你的测试得出的结论是正确的。
直接await单个协程时,执行逻辑是串行阻塞等待:必须等前一个await的协程执行完成,才会运行后面的代码,你测试里三次串行await asyncSleeper()总耗时3秒,和同步执行没有差异,自然拿不到异步的性能收益。
而调用asyncio.create_task()本质是把协程提交到当前事件循环的调度队列,让事件循环可以并行调度多个任务:三个协程的等待逻辑(示例里是asyncio.sleep(1))可以同时挂起执行,总耗时就只有最长的单任务耗时1秒,完全释放了异步的并发能力。
补充:除了手动调用
create_task,用asyncio.gather()、asyncio.wait()这类官方并发API也能拿到异步收益,这类API的底层逻辑也是自动把传入的协程包装成任务交给事件循环调度,不需要你手动逐个创建任务。
异步框架的处理逻辑
Starlette、FastAPI这类异步Web框架确实会在后台自动完成请求级别的任务调度:
你编写的异步路由函数,框架在收到对应请求后,会自动把整个路由函数的协程包装成任务提交到事件循环运行,不同请求的协程可以被事件循环并发调度,不需要业务开发手动调用create_task处理请求级别的并发。
但要注意:框架只会自动处理不同请求之间的并发调度,不会自动识别单个请求内部有哪些可以并行的异步逻辑。如果你单个接口内部有多个可并行的异步操作(比如同时调用三个第三方接口、同时查询多个无关的数据库表),还是需要你自己手动用create_task或者asyncio.gather()实现单请求内部的并发,才能拿到这部分的性能收益。
内容的提问来源于stack exchange,提问作者Aaron56

