协程(1)
coroutine 协程是什么? 官方是如何实现协程 native coroutine generator-based coroutine 其他协程库 greelet 目前还有哪些坑? 背景 处理io密集问题一般有三种模式: 多进程 多线程 io复用+单线程回调 有了协程后,可以使用io复用+单线程搭配协程。 为什么不用回调呢? 步骤多或者嵌套深,捕捉异常或者阅读代码都会很困扰。而使用协程,让原来要使用异步+回调方式写的复杂代码,可以用看似同步的方式写出来。堆栈信息也很清晰,便于编写和维护 协程是什么 下文是根据官方的实现所定义,与greenlet, golang的goroutine不同 协程直接给它一个定义似乎不太容易,我会从它的运行方式及外沿来描述它。 在单线程中,过程A可被过程B打断,并保存此时过程A的上下文,且执行过程B,稍后过程B交回控制权,恢复过程A的上下文并从过程A的中断处继续执行。这是协程的运行方式。 换句话说,协程就像一个可被打断后继续执行的函数。一个线程中可以开多个协程,但某一时刻只有一个协程在运行。 如何实现协程 目前Python官方的协程实现方式有两种: generator-based coroutine native coroutine generator-based coroutine yield 要明白基于生成器的协程的工作方式,得先弄清生成器是怎么工作的,要说清楚生成器是怎么工作还得说明Python代码基于cpython是怎么执行的。 python代码会被编译成bytecode。 C程序中执行Python函数的函数叫PyEval_EvalFrameEx,当其遇到bytecode为CALL_FUNCTION,会在Python堆栈上新建一个栈帧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 >>> def bar(): ....