3 ответов:
Я начну с генераторов, поскольку они являются самым простым случаем. Как упоминал @ zvolkov, это функции / объекты, которые могут быть повторно вызваны без возврата, но при вызове вернут (дадут) значение, а затем приостановят их выполнение. Когда они будут вызваны снова, они начнут с того места, где они в последний раз приостановили выполнение, и снова сделают свое дело.
генератор по существу является сокращенной (асимметричной) сопрограммой. Разница между сопрограмм и генераторов что сопрограмма может принимать аргументы после того, как она была первоначально вызвана, в то время как генератор не может.
это немного сложно для некоторых с тривиальным примером того, где вы будете использовать сопрограммы, но вот моя лучшая попытка. Возьмите этот (составленный) код Python в качестве примера.
def my_coroutine_body(*args): while True: # Do some funky stuff *args = yield value_im_returning # Do some more funky stuff my_coro = make_coroutine(my_coroutine_body) x = 0 while True: # The coroutine does some funky stuff to x, and returns a new value. x = my_coro(x) print xпример использования сопрограмм-это лексеры и Парсеры. Без сопрограмм в языке или эмулированных каким-либо образом, лексический и синтаксический код должен быть смешан вместе, даже если они действительно две отдельные проблемы. Но используя сопрограммы, можно выделить лексический разбор и парсинг кода.
(Я собираюсь пройтись по разнице между симметричными и асимметричными сопрограммами. Достаточно сказать, что они эквивалентны, вы можете конвертировать из одного в другой, и асимметричные сопрограммы, которые больше всего похожи на генераторы, легче понять. Я описывал, как можно реализовать асимметричные сопрограммы в Python.)
продолжения на самом деле довольно простые звери. Все они являются функциями, представляющими другую точку в программе, которая, если вы ее вызовете, заставит выполнение автоматически переключиться на точку, которую представляет эта функция. Вы используете очень ограниченные версии их каждый день даже не осознавая этого. Исключения, например, можно рассматривать как своего рода продолжение наизнанку. Я дам вам пример псевдокода на основе Python для продолжения.
скажем, у Python была функция с именем
callcc(), и эта функция принимала два аргумента, первый из которых был функцией, а второй-списком аргументов для ее вызова. Единственным ограничением для этой функции будет то, что последний аргумент, который она принимает, будет функцией (которая будет нашим текущим продолжением).def foo(x, y, cc): cc(max(x, y)) biggest = callcc(foo, [23, 42]) print biggestчто бы случилось это
callcc()в свою очередь называютfoo()с текущим продолжением (cc), то есть ссылка на точку в программе, в которойcallcc()называлась. Когдаfoo()вызывает текущее продолжение, это по сути то же самое, что сказатьcallcc()чтобы вернуть значение, с которым вы вызываете текущее продолжение, и когда он это делает, он откатывает стек туда, где было создано текущее продолжение, т. е. когда вы вызвалиcallcc().результатом всего этого будет то, что наш гипотетический вариант Python будет печатать
'42'.Я надеюсь, что это поможет, и я уверен, что мое объяснение может быть улучшено на совсем немного!
сопрограмма - это одна из нескольких процедур, которые по очереди выполняют свою работу, а затем делают паузу, чтобы дать контроль другим сопрограммам в группе.
Продолжение-это "указатель на функцию", который вы передаете некоторой процедуре, которая будет выполнена ("продолжение"), когда эта процедура будет выполнена.
генератор (в .NET) - это языковая конструкция, которая может выплюнуть значение, "приостановить" выполнение метода, а затем перейти из той же точки, когда будет предложено следующее значение.
в новой версии Python вы можете отправлять значения генераторам с помощью
generator.send(), Что делает генераторы python эффективно сопрограммы.основное различие между генератором python и другим генератором, скажем greenlet, заключается в том, что в python ваш
yield valueможно только вернуться обратно к вызывающему абоненту. В то время как в greenlet,target.switch(value)может привести вас к определенной целевой сопрограмме и дать значение, гдеtargetбудет продолжать работать.
Comments