Frage

Das Konzept einer Koroutine klingt sehr interessant, aber ich weiß nicht, ob es Sinn in einer realen Produktionsumgebung macht? Welche Anwendungsfälle für Koroutinen, die mehr elegant gelöst werden können, einfacher oder effizienter als mit anderen Methoden?

War es hilfreich?

Lösung

True Koroutinen erfordern Unterstützung durch Ihre Werkzeuge -. Sie müssen von dem zugrunde liegenden Rahmen durch den Compiler und unterstützt umgesetzt werden

Ein Beispiel aus der Praxis von Koroutinen mit der „yield return“ Schlüsselwort bereitgestellt in C # 2.0, gefunden, die Sie eine Methode schreiben können, die für die Schleife mehrere Werte zurückgibt.

Das „yield return“ hat mit Einschränkungen verbunden, aber - die Umsetzung eine Hilfsklasse verwendet Zustand zu erfassen, und es unterstützt nur einen speziellen Fall von Koroutine als Generator (Iterator)

.

Im allgemeineren Fall der Vorteil Koroutinen ist, dass sie bestimmte zustandsbasierten Berechnungen viel einfacher auszudrücken und leichter verständlich zu machen - Implementierung einer Zustandsmaschine als ein Satz von Koroutinen kann sein eleganter als mehr gemeinsame Konzepte . Aber, dies zu tun erfordert die Unterstützung und Werkzeuge, die noch nicht in C # oder Java existieren.

Andere Tipps

Einige gute Antworten zu beschreiben, was Koroutinen sind.

Aber für einen tatsächlichen Anwendungsfall. Nehmen Sie einen Web-Server. Es mehrere gleichzeitige Verbindungen hat, und sie will das Lesen und Schreiben alle von ihnen planen.

Dies kann mit Hilfe Koroutinen umgesetzt. Jede Verbindung ist ein Koroutine, die / schreibt eine kleine Menge Daten liest, dann „Ausbeuten“ Kontrolle an den Scheduler, der auf die nächste Koroutine geht (was macht das Gleiche), wie wir durch alle zur Verfügung stehenden Verbindungen.

Viele von ihnen, zum Beispiel:

grep TODO *.c *.h | wc -l

oben Die Pipeline ist genau ein Koroutine: der grep Befehl eine Folge von Linien erzeugt, die zu einem Puffer gehen, der wc Befehl „frisst sie oben“; wenn der Puffer füllt, die grep „Blöcke“, bis der Puffer leert, und wenn der Puffer leer ist, werden die wc Befehl wartet auf neue Eingabe.

Die Sache über Koroutinen ist, dass sie am häufigsten sind jetzt entweder in eingeschränkteren Mustern, wie die Python-Generatoren genannt, oder als Rohrleitungen verwendet.

Wenn Sie möchten, um sie mehr betrachten, sehen den Artikel Wikipedia, vor allem auf Koroutinen und Iteratoren .

Ich weiß, das fast 5 Jahre ist da die Frage gestellt wurde, aber ich bin niemand überrascht den Anwendungsfall der Spiele erwähnt, wo Koroutinen viel verwendet werden, um im wesentlichen eine Rechenzeit in Scheiben schneiden.

Um eine konsistente Bildrate in einem Spiel zu halten, sagen wir 60 fps, haben Sie 16.6ms Code in jedem Rahmen auszuführen. Dazu gehören Physik-Simulation, Eingangsverarbeitung, Zeichnen / Malen.

Nehmen wir an Ihrer Methode in jedem Frame ausgeführt wird. Wenn Ihre Methode eine lange Zeit in Anspruch nimmt und endet mehrere Frames Spanning, werden Sie Rest der Berechnung in der Spielschleife staffeln, die in dem Benutzer führt „jank“ (ein plötzlicher Abfall der Framerate) zu sehen.

Was Koroutinen können Sie tun, ist irgendwie Zeitscheibe diese Berechnung, so dass es ein wenig in jedem Rahmen ausgeführt wird.

Um das zu erreichen, ermöglicht Koroutinen im Wesentlichen die Methode „Ausbeute“ die Berechnung zurück zu dem „Anrufer“ (in diesem Fall der Spielschleife), so dass das nächste Mal die Methode aufgerufen wird es wieder aus, wo er unterbrochen wird.

Koroutinen sind nützlich, Erzeuger / Verbraucher-Muster zu implementieren.

Zum Beispiel führte Python Koroutinen in einer Sprache Feature namens Generatoren , die beabsichtigt wurde, die Einführung von Iteratoren zu vereinfachen.

Sie können auch nützlich sein kooperatives Multitasking zu implementieren, wobei jede Aufgabe ein Koroutine ist, die zu einem Scheduler / Reaktor ergibt.

Koroutinen kann nützlich sein, jederzeit ein System aus zwei oder mehr Teilen des Codes, deren natürlichste Darstellung als eine sequentielle Reihe von Schritten sein würde, die eine Menge Warte einzubeziehen.

Betrachten sie zum Beispiel eine Vorrichtung, die eine LCD-und-Tastatur-Benutzeroberfläche und ein Modem, und es muss das Modem verwenden regelmäßig anrufen und seinen Status unabhängig berichtet von dem, was der Benutzer auf der Tastatur tut. Der schönste Weg, um die Benutzeroberfläche schreiben können Funktionen wie „input_numeric_value (& CONV_SPEED_FORMAT & conveyor_speed);“ welches kehrt, wenn ein Benutzer einen Wert eingegeben hat, und den schönsten Weg, um die Kommunikation zu handhaben kann Verwendung Funktionen wie seine „wait_for_carrier ();“ die zurückkehren wird, wenn das Gerät entweder verbunden oder bestimmt, es wird nicht.

Ohne Koroutinen, entweder das UI-Subsystem oder das Modem-Subsystem müßte umgesetzt werden, um eine Zustandsmaschine. Mit Koroutinen macht es möglich, dass beide Teilsysteme auf die natürlichste Art geschrieben werden. Beachten Sie, dass es wichtig ist, dass weder Subsystem immer sehr lange geht, ohne die Dinge in einen „konsistenten“ Zustand zu setzen und fordern yield (), noch ruft yield (), ohne zuerst die Dinge in einen „konsistenten“ Zustand zu setzen, aber es ist in der Regel nicht schwer, diejenigen zu treffen Einschränkungen.

Beachten Sie, dass während eines ausgewachsenen Multitasking nutzen könnten, dass die Verwendung von Schlössern überall zu jeder Zeit gemeinsam genutzten Zustand geändert wird, erfordert. Da die Koroutine Switcher nicht immer wird die Dinge wechseln, außer bei yield () aufruft, entweder Routine frei gemeinsamen Zustand ändern kann, solange es, dass alles in, um vor der nächsten Ausbeute gewährleistet und für die andere Routine vorbereitet zu verändern Zustand " (während“der Ausbeute).

Als ein spezifisches Beispiel in der Producer / Consumer-Linie, etwas so Einfach wie das bescheidene Batch-Reporting-Programm könnte tatsächlich Co-Routinen verwenden.

Der Schlüssel für dieses Hinweis Beispiel ist mit einem nicht-trivialen Arbeitseingangsdaten verbrauchen (beispielsweise Daten-Parsing oder Gebühren und Zahlungen auf einem Konto ansammelt), und nicht-triviale Arbeit um die Ausgabe zu erzeugen. Wenn Sie diese Eigenschaften haben:

  • Es ist leicht zu organisieren / versteht den eingangsseitigen Code, wenn Sie Arbeitseinheiten an verschiedenen Stellen „emittieren“ können.
  • Es ist ebenfalls einfach, den ausgangsseitigen Code zu organisieren / verstehen, wenn es in einer verschachtelten Steuerstruktur der nächste Einheit der Arbeit kann „greifen“.

dann Koroutinen und Warteschlangen sind beide schönen Techniken zur Verfügung zu haben.

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