协程总结

总结:

  1. asyncio 只需要 单线程 就能实现 并发,每个线程中只能有一个 事件循环事件循环 使用 协作式调度(cooperative scheduling),一次只运行一个 Task(如果你在其它线程中也启动了 事件循环,则可以并行运行多个 Task)。当它启动后,会依次从任务队列获取 Task 并执行它
  2. 每个 Task 会自动执行 协程 的下一步,即发送 result = coro.send(None)
  3. 如果 协程 通过 await 或 yield from 调用了其它 协程,则当前 协程 被 暂停(suspend) 并进行协程的上下文切换(保存当前协程的 variables、state 等,然后导入其它协程的上下文)
  4. 如果其它 协程 中也使用了 await 或 yield from 调用了其它 协程,则重复步骤 3,直到某个协程(比如 asyncio.sleep())中调用了 await future 或 yield from future,则执行 Future 对象的 __await__ 或 __iter__ 方法,通过 yield self 直接返回 Future 对象本身给 Task 中的 result并把控制权 交还 给 事件循环Task 会向 事件循环 注册事件: 当 Future 对象完成时,请执行我的 __wakeup() 方法 唤醒 我
  5. 事件循环 重复步骤 1,继续调度执行其它任务
  6. 当某个 Future 对象(代表耗时的异步操作,如网络 I/O)运行完成后,会被设置结果。同时,事件循环 会 唤醒 对应的 Task 继续运行,又发送 result = coro.send(None) 让协程链上的各个协程依次 恢复执行(resume)。此时,Future 对象会将它的结果作为 返回值 通过 StopIteration 异常发送给等待它的 协程,协程链上的各个协程依次返回值(可能会再处理),最终 Task 会获取经过各协程处理后的数据,并设置为它的结果,至此,该 Task 运行结束
posted @ 2022-12-04 21:13  AnthonyWang  阅读(33)  评论(0)    收藏  举报