Frage

Was ist der Unterschied zwischen einem Koroutine und einer Fortsetzung und einem Generator?

War es hilfreich?

Lösung

Ich werde mit Generatoren starten, da sie die einfachste Fall sind. Wie @zvolkov erwähnt, sind sie Funktionen / Objekte, die wiederholt ohne Rückkehr aufgerufen werden kann, aber wann wird zurückkehren (Ausbeute) mit einem Wert genannt und dann ihre Ausführung suspendieren. Als sie wieder genannt werden, werden sie beginnen, von wo sie letzte Hinrichtung ausgesetzt und wieder ihr Ding.

Ein Generator ist im wesentlichen eine Senkung (asymmetrisch) Koroutine. Der Unterschied zwischen einem Koroutine und Generator ist, dass ein Koroutine Argument akzeptieren kann, nachdem sie zunächst genannt wurde, während ein Generator nicht.

Es ist ein bisschen schwierig, mit einem trivialen Beispiel zu kommen, wo Sie Koroutinen verwenden würden, aber hier ist mein Beste versuchen. Nehmen Sie diese (aus) Python-Code als Beispiel.

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

Ein Beispiel, wo Koroutinen verwendet werden, ist lexers und Parser. Ohne Koroutinen in der Sprache oder irgendwie emuliert, lexing und Parsing-Code muss zusammen sogar gemischt werden, obwohl sie sind wirklich zwei getrennte Bedenken. Aber mit einem Koroutine, können Sie das lexing und Parsing-Code trennen.

(Ich werde den Unterschied zwischen symmetrischen und asymmetrischen Koroutinen bestreichen es genügt zu sagen, dass sie gleichwertig, die Sie von einem zum anderen konvertieren, und asymmetrische Koroutinen -. Welches sind die meisten wie Generatoren- -sind die leichter zu verstehen. ich war darlegt, wie ein asymmetrisches Koroutinen in Python implementieren könnte.)

Fortsetzungen sind eigentlich ganz einfach Tiere. Alles, was sie sind, sind Funktionen einen weiteren Punkt im Programm darstellt, die, wenn Sie es nennen, dass Funktion darstellt Ausführung automatisch auf den Punkt verursacht zu wechseln. Sie verwenden sehr eingeschränkte Versionen von ihnen jeden Tag, ohne es zu merken. Ausnahmen, zum Beispiel, können von innen nach außen als eine Art Fortsetzung gedacht werden. Ich gebe Ihnen ein Python-basierten Pseudo-Code Beispiel für eine Fortsetzung.

Say Python hatte eine Funktion callcc() genannt, und diese Funktion hat zwei Argumente, die erste ist eine Funktion, und die zweite ist eine Liste von Argumenten ist es mit zu nennen. Die einzige Beschränkung dieser Funktion wäre, dass das letzte Argument dauert es eine Funktion sein (die in unserer aktuellen Fortsetzung sein werden).

def foo(x, y, cc):
   cc(max(x, y))

biggest = callcc(foo, [23, 42])
print biggest

Was passieren würde, ist, dass callcc() würde wiederum Anruf foo() mit der aktuellen Fortsetzung (cc), das heißt, ein Verweis auf die Stelle im Programm, an dem callcc() genannt wurde. Wenn foo() die aktuelle Fortsetzung nennt, es ist im Wesentlichen die gleichen callcc() wie zu sagen mit dem Wert zurückkehren werden Sie mit der aktuellen Fortsetzung Aufruf, und wenn es das tut, rollt sie den Stapel zurück, wo wurde die aktuelle Fortsetzung erstellt, das heißt, wenn Sie genannt callcc().

Das Ergebnis all dies wäre, dass unsere hypothetische Python Variante '42' drucken.

Ich hoffe, das hilft, und ich bin sicher, dass meine Erklärung auf ziemlich viel verbessert werden!

Andere Tipps

Coroutine ist eines von mehreren Verfahren, die abwechselnd ihre Arbeit tun nehmen und dann Pause Steuerung zu den anderen Koroutinen in der Gruppe zu geben.

Fortsetzung ist ein „Zeiger auf eine Funktion“ Sie zu einem gewissen Prozedur übergeben, ausgeführt werden ( „fortgesetzt mit“), wenn das Verfahren durchgeführt wird.

Generator (in NET) ist ein Sprachkonstrukt, das einen Wert auszuspucken kann, „Pause“ Ausführung des Verfahrens und dann vom selben Punkt gehen, wenn für den nächsten Wert gefragt.

In neuerer Version von Python, Sie können Werte Generatoren mit generator.send() senden, die effektiv Koroutinen Python-Generatoren machen.

Der wesentliche Unterschied zwischen Python-Generator und anderem Generator, greenlet sagt, ist, dass in Python, Ihre yield value nur zurück an den Aufrufer zurückgeben können. Während in greenlet, target.switch(value) können Sie zu einer bestimmten Ziel Koroutine nehmen und einen Wert ergeben, wo der target laufen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top