📖 知识点
核心思路
使用asyncio.create_task一次性创建多个异步任务,然后逐个 await 等待全部任务完成。并发:多个任务交替执行,IO 等待时切换,不是同一时刻多核并行计算。
示例代码
import asyncio
async def work(name, delay):
print(f"{name} 启动,等待{delay}秒")
await asyncio.sleep(delay)
print(f"{name} 完成")
async def main():
# 创建2个任务,提交调度
task1 = asyncio.create_task(work("任务A",2))
task2 = asyncio.create_task(work("任务B",2))
# 等待两个任务全部结束
await task1
await task2
asyncio.run(main())
总耗时大约2 秒,而不是 4 秒!两个任务并发等待。
补充:asyncio.gather(批量收集任务)
当任务数量多的时候,asyncio.gather()可以一次性接收多个协程,自动创建任务,等待全部完成,并收集所有返回结果。
# gather写法,更简洁
async def main():
await asyncio.gather(
work("任务A",2),
work("任务B",2)
)
💡 两种方式对比
create_task + 逐个 await:可控性更强,可以单独控制每个任务
asyncio.gather:一次性批量运行,适合一次性发起一批查询,统一等待结果
⚠️ 重点提醒
并发的提速只体现在IO 等待阶段;CPU 密集计算不会提速
所有任务共享同一个事件循环,单线程内切换
⚔️ Kata 实战任务
任务需求:
导入 asyncio
协程函数
query_data(name, wait):打印{name}开始查询,await asyncio.sleep (wait),打印{name}查询完成main 协程,创建两个任务:
task1:
query_data("查询1", 2)task2:
query_data("查询2", 2)
await 等待 task1、task2 全部执行完毕
观察总耗时
参考代码
import asyncio
async def query_data(name, wait):
print(f"{name}开始查询")
await asyncio.sleep(wait)
print(f"{name}查询完成")
async def main():
# 创建2个并发任务
task1 = asyncio.create_task(query_data("查询1", 2))
task2 = asyncio.create_task(query_data("查询2", 2))
print("全部任务已提交,开始并发执行")
# 等待两个任务完成
await task1
await task2
print("✅ 所有查询任务全部结束")
asyncio.run(main())
运行输出
全部任务已提交,开始并发执行
查询1开始查询
查询2开始查询
# 等待约2秒
查询1查询完成
查询2查询完成
✅ 所有查询任务全部结束
🧠 思考题
两个任务都是等待 2 秒,并发执行总耗时约 2 秒,如果改成串行执行需要多久?
asyncio.gather 和 create_task 两种写法,你觉得分别适合什么场景?
行者孙Python