关于维基百科中的示例: http://en.wikipedia.org/wiki/Coroutine
var q := new queue
coroutine produce
loop
while q is not full
create some new items
add the items to q
yield to consume
coroutine consume
loop
while q is not empty
remove some items from q
use the items
yield
我只是想知道基于传统事件的方法可以处理这种使用模式,为什么需要使用协同程序?
答案 0 :(得分:4)
我认为这是“传统”的协同程序,事件是“现代的”。但是,他们也有不同的目的; AFAIK,协程可以指定转移控制的位置(如方法调用)或用于time-share,而事件是松散耦合的通信(即在layered architecture中“向上”通信)。
如果您对这些事情感兴趣,请务必阅读Eric Lippert's blog series(自2010年10月起)关于继续传递风格的内容。有一篇帖子标题为“Musings about coroutines”。
答案 1 :(得分:0)
在事件驱动程序中,您正在状态机上工作,您需要显式地保持当前状态并通过使用开关或一系列回调来处理处于该状态的工作。这样的程序是非线性的。
在基于协程的系统中,您可以像通常编写单线程程序一样编写线性程序,但是除了在每个事件等待点进行阻塞之外,您还可以切换上下文并让其他组件继续工作直到事件发生来在许多基于协程的系统中,您会发现一个事件循环,该循环驱动协程并在事件到达时切换进或退出协程。