yield
仲有文章有空再看 http://www.oschina.net/translate/cooperative-multitasking-using-coroutines-in-php
http://www.laruence.com/2015/05/28/3038.html
作者:赵老师
链接:https://www.zhihu.com/question/26966414/answer/85363510
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/26966414/answer/85363510
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这是php实现协程的方式。
要理解协程,首先要理解:代码是代码,函数是函数。函数包裹的代码赋予了这段代码附加的意义:有参数,有返回值,当函数调用另个函数的时候,必须等这个函数返回,当前函数才能返回,这就构成了后进先出,也就是stack。
而协程包裹的代码,不是函数,不完全遵守函数的这些附加的意义,协程执行到某个点,他yield,而不是return,再次调用协程的时候,会在上次yeild的点继续执行。
所以携程违背了通常操作系统和x86的cpu认定的代码执行方式,也就是stack的这种执行方式,需要运行环境(比如php,python的yield和golang的goroutine)自己调度,来实现你所要求的这种代码执行的语义。
具体来说,一个包含yeild的php函数,就是协程,他有阶段性的结算值 yield $var, 但是代码并不返回,php的调度者接到这个值后,喂给一个generator,generator是个实现了iterator接口的+和协程通讯接口(比如send方法)的实例,所以可以用在for循环里(另个接口负责和协程通讯)。那么gnenerator收到了这个协程的阶段性的值后,他喂给for循环,等for循环下一次循环的时候,他又启动这个协程,协程从上次中断的点继续执行,继续计算,继续yeild值给generator,generator喂for循环,继续循环,直到协程执行完毕。
要理解协程,首先要理解:代码是代码,函数是函数。函数包裹的代码赋予了这段代码附加的意义:有参数,有返回值,当函数调用另个函数的时候,必须等这个函数返回,当前函数才能返回,这就构成了后进先出,也就是stack。
而协程包裹的代码,不是函数,不完全遵守函数的这些附加的意义,协程执行到某个点,他yield,而不是return,再次调用协程的时候,会在上次yeild的点继续执行。
所以携程违背了通常操作系统和x86的cpu认定的代码执行方式,也就是stack的这种执行方式,需要运行环境(比如php,python的yield和golang的goroutine)自己调度,来实现你所要求的这种代码执行的语义。
具体来说,一个包含yeild的php函数,就是协程,他有阶段性的结算值 yield $var, 但是代码并不返回,php的调度者接到这个值后,喂给一个generator,generator是个实现了iterator接口的+和协程通讯接口(比如send方法)的实例,所以可以用在for循环里(另个接口负责和协程通讯)。那么gnenerator收到了这个协程的阶段性的值后,他喂给for循环,等for循环下一次循环的时候,他又启动这个协程,协程从上次中断的点继续执行,继续计算,继续yeild值给generator,generator喂for循环,继续循环,直到协程执行完毕。
浙公网安备 33010602011771号