回复内容:
这是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循环,继续循环,直到协程执行完毕。
上面两位兄台所说的yield是其作为generator的用法,也就是yield作为语句的时候。当yield当作表达式用的时候,那就是“协程”的用法了。具体请看:PHP 使用协同程序实现合作多任务
含有yield关键字的函数被调用时候和普通函数不同,他不执行函数代码,而是返回一个generator对象,这个对象是可迭代对象,具有next()方法,调用一次next方法执行到yield那里的时候暂停一下,返回一次计算的值(用法类似return),当再次调用next()方法时,接着yield下面代码循环执行知直到又碰到yield,返回下一个循环计算的值。。。这样不就动态生成值了么,一次一个不占内存。碰到这个词的时候大概就是告诉程序,来我要生成个generator对象并返回了。
中文文档PHP: 生成器总览