php 的yield叫协程,go的goroutine也叫协程,它这两种完全不一样吧?

php等语言里的yield,不是协程语法,而是迭代器语法。 
而包括php在内的大多数语言实现迭代器的方式,是通过一个可中断的函数完成的。

协程的一个特点就是执行中断,切换上下文。

所以就有了通过迭代器函数去实现协程的方案。这种方案充分利用了迭代器可中断的特点来模拟协程中断,而利用闭包函数的上下文独立性,实现协程的上下文切换。

总结起来,什么是协程,协程是通过切换运行方法和上下文,来在同一个空间中完成不同的处理任务(注意,不是另外开线程)。 
那么协程怎么实现,goroutine就是协程的一种实现方式。 
而通过迭代器实现协程,就又是另外一种方式。 
两者的区别在于,goroutine是已经存在的实现。相当于已经成品的车,你理解起来会相当容易。 
迭代器只是提供者实现协程的方法,具体要实现协程,还需要自己去写代码完成。这就好像是汽车的零件,你需要自己组装,所以还需要深入学习你才能理解它的原理

参考文献:

https://segmentfault.com/q/1010000011073517

最新回复(0)
/jishuZbQJ3GsqzFSMLIEpil_2BiZsMrivCdJ06XhAcCWA_3D_3D4794558
8 简首页