当前位置:首页>python>python协程

python协程

  • 2026-10-11 07:57:16
python协程
一.什么是python协程?
协程(corroutine)是一种比线程更轻量级的并发编程模型,协程的调度完全由程序控制(用户空间),不依赖操作系统内核,避免了线程切换的开销.
协程在执行的过程中主动让出(yield)控制权,并在需要恢复时(resume)执行,保留之前的上下文(如局部变量,执行位置)
二.协程的使用方式
1.async/await
适用于单任务线性逻辑,通过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密集型/混合

隔离性要求高的任务

最新文章

随机文章