协程的理解 协程是什么协程是用户态的轻量级并发执行单元。允许在单个线程中执行多个任务通过程序自身控制的方式实现任务切换提供高效的并发处理。协程不同于线程线程是通过 OS 内核进行抢占式被 OS 时钟中断强行剥夺 CPU的调度线程切换的时候需要进入内核态开销大且存在竞争锁的问题而协程的调度是由用户态程序事件循环决定一般称为协作式调度且不需要加锁因为同一时刻只有一个协程在运行只有遇到 await 的时候才会让出 cpu 的控制权。协程的底层三要素可等待对象一般可以跟在 await 后面的东西可以分为三类原生协程async def函数返回的对象、task对协程的进一步封装用于并发执行、future底层占位符表示“将来某个时刻会有结果”Task 是 Future 的子类。事件循环这是协程的引擎本质上是一个无限循环底层维护两个主要队列就绪队列存放可以立即执行的协程/回调。定时/等待队列存放正在等待 I/O 或定时器的协程处于挂起状态。事件循环的大致工作流程循环每次从就绪队列中取一个协程执行直到当前协程遇到 await 然后就会被挂起此时将底层的文件描述符来注册到 I/O 多路复用机制中epoll、select并把当前协程放入等待队列中当 I/O 就绪时事件循环将该协程放入就绪队列中然后等待被执行。任务在事件循环中运行asyncio.create_task(coro)时协程会被包装成 Task 对象。Task 会立即在事件循环中调度执行而不需要当前代码显式await它但通常需要await来获取结果否则会成为后台任务。结合 Python 中的 asyncio 来理解协程import asyncio # 定义了一个协程函数 async def a(): await asyncio.sleep(2) print(A 完成) return A结果 # 后序解释 await 干了什么 async def b(): res_a await a() if __name__ __main__: asyncio.run(b())在上述代码中使用 async def 定义了一个两个协程函数 a 和 b并且函数体内部都使用了 await 关键字然后运行 asyncio.run() 。下面说一下整体的工作流程当我们运行这个脚本的时候asyncio.run(b()) 这条语句首先是给 b 创建了一个协程对象然后将该协程对象放入到事件循环中准确来说是放入事件循环中的就绪队列中这个时候就绪队列中只有一个协程对象所以会立即执行 b进入到函数体内部知道遇到 await也就是res_a await a()这条语句可以这么理解首先是调用了 a但又会执行 a 的函数体只是产生了一个可调用对象这里就是协程对象然后会将 b 这个这个协程对象立即停止并且保存 b 相关的状态然后将 b 放入等待队列中将 a 放入就绪队列中事件循环这个时候取出 a 并执行 a一直等到 a 执行完成之后将 a 的执行结果返回给 res_a然后将 b 添加到就绪队列中事件循环继续取出 b 然后执行 b 后序的语句。以上就是结合 Python 对协程的一点理解其实协程还有更多的知识点比如说协程里面其实也有串行、并行、后台这些不同的工作方式需要根据具体的业务场景来决定使用方式。如果你想更加深入的了解可以评论我来继续讲解。不过个人认为理解了上面的核心三要素其实已经就掌握的差不多了。