行者孙Python

御气篇- Day83 多任务并发执行

📖 知识点

核心思路

使用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)
    )

 

💡 两种方式对比

  1. create_task + 逐个 await:可控性更强,可以单独控制每个任务

  2. asyncio.gather:一次性批量运行,适合一次性发起一批查询,统一等待结果

⚠️ 重点提醒

  • 并发的提速只体现在IO 等待阶段;CPU 密集计算不会提速

  • 所有任务共享同一个事件循环,单线程内切换

⚔️ Kata 实战任务

任务需求:

  1. 导入 asyncio

  2. 协程函数query_data(name, wait):打印{name}开始查询,await asyncio.sleep (wait),打印{name}查询完成

  3. main 协程,创建两个任务:

    • task1:query_data("查询1", 2)

    • task2:query_data("查询2", 2)

  4. await 等待 task1、task2 全部执行完毕

  5. 观察总耗时

参考代码

 

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查询完成
✅ 所有查询任务全部结束

 

🧠 思考题

  1. 两个任务都是等待 2 秒,并发执行总耗时约 2 秒,如果改成串行执行需要多久?

  2. asyncio.gather 和 create_task 两种写法,你觉得分别适合什么场景?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我