Что касается примера в википедии: 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
Мне просто интересно, что традиционный подход, основанный на событиях, может справиться с такого рода шаблоном использования, зачем использовать сопрограмму?