Различие между сопрограммами и генераторами в контексте Koa?

Различие между сопрограммами и генераторами для меня размыто.

Буду признателен, если кто-нибудь прочитает статью Обратные вызовы против сопрограмм — взгляд на обратные вызовы, генераторы и сопрограммы" на https://medium.com/code-приключения/174f1fe66127

... а затем объясните, где и как в этой статье проиллюстрирована/представлена ​​разница и конкуренция (в заголовке используется термин «против») между генераторами и сопрограммами? В более общем смысле мой вопрос заключается в том, что на самом деле представляет собой это различие, и применимо ли это различие к тому, как можно изменить шаблон кодирования для обработки асинхронных запросов при создании приложения в Koa (в Node.js)?


person JLS    schedule 16.04.2014    source источник


Ответы (1)


Генераторы иногда называют «полусопрограммами», более ограниченной формой сопрограммы, которая может уступать только вызывающей стороне. Это делает использование генераторов более явным, чем сопрограммы, поскольку только полученные значения могут приостановить «поток».

«генераторы» находятся на более низком уровне, чем сопрограммы. Их можно использовать в качестве строительных блоков для библиотеки сопрограмм. Вы можете создать библиотеку «coroutine», если у вас есть «генераторы» на языке.

ES6 предоставляет «генераторы», поэтому вы можете использовать библиотеку «сопрограмм» для реализации программирования сопрограмм в узле (последовательно, с попыткой поймать вместо обратного вызова)

С помощью библиотеки сопрограмм вы можете «дождаться» завершения асинхронного вызова.

проверьте: https://github.com/luciotato/waitfor-ES6

person Lucio M. Tato    schedule 16.04.2014
comment
Привет Лусио. Спасибо за ответ. Две вещи: - person JLS; 17.04.2014
comment
1) Ссылаясь на мой первоначальный вопрос, почему использование термина в сравнении с заголовком статьи... генераторы против сопрограмм... Это не правильный термин, или я не понимаю, что я могу оценить? по сравнению со средствами здесь? Не похоже, что это выбор между одним или другим. Сопрограммы больше похожи на логику управления для запуска генераторов и продвижения их за пределы доходности. Я на правильном пути здесь? - person JLS; 17.04.2014
comment
2) В том же духе, интересно, не могли бы вы взглянуть на aaron-powell.com/posts/, и скажите мне, соответствует ли представленная функция раннера (изложенная в конце статьи) требованиям сопрограммы. (Возможен дополнительный вопрос к вашему ответу) - person JLS; 17.04.2014
comment
Кроме того, я просмотрел как wait-ES6, так и parallel-ES6, около двух недель и только сейчас. Грамматика, которую они позволяют кодировать, очень хороша. Тем не менее, пара оговорок, которые, возможно, вы могли бы решить: 1. Помимо ваших страниц github, документации и тому подобного в Интернете мало; 2) Характеристики производительности, скажем, по сравнению с Co и Bluebird; Вероятно, я собираюсь использовать Koa для своего приложения, которое тесно связано с Co, как ваши утилиты будут работать в контексте Koa, и можете ли вы показать примеры этого? Я думаю, что связь Co с Koa дает Co маркетинговое преимущество. - person JLS; 17.04.2014
comment
(Примечание к предыдущему комментарию: формулировка ...say по сравнению с Co и Bluebird; вероятно, будет использоваться Koa... вместо этого следует читать как ...say по сравнению с Co и Bluebird?; 3) Вероятно, будет использоваться Koa.. . - person JLS; 17.04.2014
comment
1) Да, это не правильный термин. Заголовок должен быть: Взгляд на обратные вызовы против генераторов и сопрограмм. - person Lucio M. Tato; 17.04.2014
comment
2) runner — это функция, которая использует генераторы для запуска сопрограмм. Сопрограмма — это то, что вы передаете бегуну. - person Lucio M. Tato; 17.04.2014
comment
3) Да, Koa тесно связан с Co. Я думаю, что wait.for можно использовать с Koa, если вам нужен более простой синтаксис, но co предоставляет ту же функциональность и даже больше (с более сложным синтаксисом вам также нужно thunkify стандартный узел .js async fn, прежде чем вы сможете использовать его с «co») - person Lucio M. Tato; 17.04.2014
comment
Лусио - Спасибо за ответы. Вы не знаете, насколько ваше разъяснение заголовка (для вопроса 1) избавляет от путаницы. Что касается вопросов и ответов 2 и 3, есть дополнительные вопросы: - person JLS; 17.04.2014
comment
Относительно 2, ссылаясь на ту же статью, в блоке между строкой И, наконец, мы можем сделать наш генератор следующим образом: и ЗАКЛЮЧЕНИЕ, у нас есть строка бегуна кода (fn); будет ли fn сопрограммой или thunk get, который вызывается в fn, или что-то еще. Насколько я понимаю, fn называется функцией генератора. - person JLS; 17.04.2014
comment
(исправление, должно быть typede: .... или это сопрограмма, которая вызывается в fn, или это что-то еще? ... - person JLS; 17.04.2014
comment
Относительно 3. Может быть, не только для меня, но подождите-рынок ES6, если вы готовы, не могли бы вы изложить или свой ответ, возможно, с параллельным сравнением с Co (или фасадом Koa), особенно в относительно нет необходимости thunkify . (Может быть, лучше представить это на странице github wait-ES6, чем здесь). Я думаю, что параллельное сравнение того, как различные генераторы (возможно, лучше называемые сопрограммами) libs обрабатывают различные сценарии кошек, было бы полезно для многих. Я чувствую, что Коа со временем получит большое количество последователей, поэтому было бы полезно сделать это и в контексте Коа, если бы можно было показать, что разум может обойти Коа. - person JLS; 17.04.2014