协程(corroutine)是一种比线程更轻量级的并发编程模型,协程的调度完全由程序控制(用户空间),不依赖操作系统内核,避免了线程切换的开销.协程在执行的过程中主动让出(yield)控制权,并在需要恢复时(resume)执行,保留之前的上下文(如局部变量,执行位置)适用于单任务线性逻辑,通过await调度让出控制权利,asyncio.run手动触发执行import asyncio#通过async def定义异步函数返回一个协程对象async def main(): print("hello") #事件循环负责执行协程,并在遇到await时挂起当前协程,并切换到下一个可执行的协程 await asyncio.sleep(1) #await 后面是可等待对象(协程对象,asyncio.Future,asyncio.Task) print("world")if __name__ == "__main__": #自动创建管理事件循环(Event Loop),每次运行创建一个新的时间循环 asyncio.run(main())
2.asyncio.create_task并发执行import asyncioasync def task(name,delay): print(f"{name} started") await asyncio.sleep(delay) print(f"{name} finished")async def main(): task1=asyncio.create_task(task("task1",2)) task2=asyncio.create_task(task("task2",1)) print("tasks is running in background....") await task1 await task2if __name__ == "__main__": asyncio.run(main())
3.async/wait 和asyncio.create_task底层实现机制 底层机制 | async/await | asyncio.create_task() |
协程状态管理 | 通过生成器(Generator)实现挂起/恢复 | 将协程包装为 Task,加入事件循环队列 |
调度控制 | 显式通过 await 让出控制权 | 隐式由事件循环调度任务切换 |
任务生命周期 | 协程对象需手动触发执行 | Task 对象创建后立即自动调度 |
import asyncioimport randomasync def producer(queue, producer_id): """生产者协程:生成数据并放入队列""" for i in range(1, 4): # 每个生产者生成3个数据 item = f"产品-{producer_id}-{i}" await asyncio.sleep(random.uniform(0.1, 0.5)) # 模拟生产耗时 await queue.put(item) # 异步放入队列 print(f"生产者 {producer_id} 生产了 {item}")async def consumer(queue, consumer_id): """消费者协程:从队列取出并处理数据""" while True: item = await queue.get() # 异步获取数据 await asyncio.sleep(random.uniform(0.2, 0.8)) # 模拟消费耗时 print(f"消费者 {consumer_id} 消费了 {item}") queue.task_done() # 标记任务完成async def main(): queue = asyncio.Queue(maxsize=3) # 限制队列容量(可选) # 启动2个生产者和3个消费者 producers = [asyncio.create_task(producer(queue, i)) for i in range(1, 3)] consumers = [asyncio.create_task(consumer(queue, i)) for i in range(1, 4)] await asyncio.gather(*producers) # 等待所有生产者完成 await queue.join() # 阻塞直到队列中的所有任务被处理完 for c in consumers: c.cancel() # 取消消费者任务(否则会无限等待)if __name__ == "__main__": asyncio.run(main())
| 协程 | 线程 | 进程 |
调度 | 用户态 | 内核态 | 内核态 |
开销 | 极小(KB级) | 较大(MB级) | 极大(GB级) |
并发 | 高(单线程万级) | 低(单机千级) | 极低(单机百级) |
适用 | I/O密集型 | CPU密集型/混合 | 隔离性要求高的任务 |