今天跟朋友聊了下Python的yield才发现generator确实是个协程实现,我之前一直当作特殊语法的iterator来看所以没怎么仔细研究。
这个yield语法最早是在PEP 255里提出的,确实是作为一个有限协程实现,能为producer-consumer模式提供一个方便的语言支持,在使用上其实和迭代器差不多除了语法不同。
但是四年后的PEP 342加入了对generator的send方法和用yield在generator内部读取send传值的用法,这个允许了generator和外界的双向通信,同时给generator一些异常支持(但是其实在这一步generator这个名字就已经很误导了,留着这个名字真的只是历史遗迹)
其实除了库作者确实也不用太关注这些有点偏的语言特性,基本上不是给上层写应用的程序员用的。后几个PEP也是在这个基础上处理一些库作者实践里遇到的问题,在现在Python社区强推async await这套asyncio的现状下,yield这套只能说是早期协程实现的遗迹,语法和名字上都挺误导人,设计也不防呆的很容易用错。