Coroutine vs Event-ориентированное программирование
Что касается примера в Википедии: 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
Мне просто интересно, что традиционный подход, основанный на событиях, может справиться с такого рода схемой использования, зачем использовать сопрограмму?
1 ответ
Я думаю, что сопрограммы являются "традиционными", а события - "современными". Тем не менее, они также имеют другое назначение; AFAIK, сопрограммы могут либо указывать, куда передавать управление (например, вызовы методов), либо использоваться для совместного использования времени, в то время как события представляют собой слабо связанные коммуникации (т.е. передача "вверх" в многоуровневой архитектуре).
Обязательно прочитайте серию блогов Эрика Липперта (от октября 2010 года) о стиле продолжения прохождения, если вас интересуют подобные вещи. Есть один пост под названием " Размышления о сопрограмм ".
В программировании, управляемом событиями, вы работаете с конечным автоматом, вам необходимо явно сохранять свое текущее состояние и обрабатывать работу, в которой вы выполняете это состояние, либо с помощью переключателя, либо с помощью последовательности обратных вызовов. Такие программы нелинейны.
В системе на основе сопрограмм вы можете написать линейную программу, как вы обычно пишете однопоточную, но вместо блокировки в каждой точке ожидания события вы переключите контекст и позволите другим компонентам выполнять свою работу, пока не придет ваше событие. Во многих системах на основе сопрограмм вы найдете цикл событий, который запускает сопрограммы и переключает сопрограммы и отключает их, когда приходит их событие.