2009-02-16 10 views
97

Was ist eine Koroutine? Wie hängen sie mit Nebenläufigkeit zusammen?Was ist eine Coroutine?

+0

Concurrent-Code haben notwendigerweise laufen in nicht:

launch{} async{} 

Sie mehr von hier lernen können "parallel" (lasst uns keine neuen Begriffe einführen). – user1712447

+0

Ich habe eine Coroutine-Bibliothek mit Standard C geschrieben, die Select/Poll/Eppll/Kqueue/Iocp/Win GUI-Nachrichten für Linux, BSD und Windows unterstützt. Es ist ein Open-Source-Projekt in https://github.com/acl-dev/libfiber. Beratung wird willkommen sein. –

Antwort

80

Coroutinen und Nebenläufigkeit sind weitgehend orthogonal. Routinen sind eine allgemeine Kontrollstruktur, bei der die Flußsteuerung kooperativ zwischen zwei verschiedenen Routinen durchgeführt wird, ohne zurückzugehen.

Die 'Yield'-Anweisung in Python ist ein gutes Beispiel. Es erstellt eine Coroutine. Wenn die 'Ausbeute' erreicht ist, wird der aktuelle Status der Funktion gespeichert und die Steuerung wird an die aufrufende Funktion zurückgegeben. Die aufrufende Funktion kann dann die Ausführung zurück an die ergebende Funktion übertragen, und ihr Zustand wird bis zu dem Punkt wiederhergestellt, an dem die "Ausbeute" angetroffen wurde, und die Ausführung wird fortgesetzt.

+9

Was ist der Unterschied zwischen dem direkten Aufrufen einer Funktion und dem Erteilen einer Coroutine mit dem Einschließen dieser Funktion in diese Coroutine? –

+1

Es wäre vielleicht besser zu erklären, dass diese beiden Konzepte in diesem Kontext nicht wirklich "orthogonal" sind. Sie können auf jeden Fall zeichnen, wie die beiden Konzepte einander ähnlich sind. Die Idee der Kontrolle zwischen zwei oder mehr Dingen ist sehr ähnlich. – steviejay

29

Von Programming in LuaCoroutines“ -Abschnitt:

A Koroutine ist ähnlich ein Gewinde (im Sinne von Multithreading): es ist eine Linie der Ausführung ist, mit einem eigenen Stapel, seine eigenen lokalen Variablen, und sein eigener Befehlszeiger; aber es teilt globale Variablen und meist alles andere mit anderen Koroutinen. Der Hauptunterschied zwischen Threads und Coroutinen besteht darin, dass ein Programm mit Threads konzeptionell (oder wörtlich in einem Multiprozessor-Computer) mehrere Threads parallel ausführt. Coroutines dagegen sind kollaborativ: Zu jedem gegebenen Zeitpunkt führt ein Programm mit Coroutinen nur eine seiner Coroutinen aus, und diese laufende Coroutine setzt ihre Ausführung nur dann aus, wenn sie ausdrücklich eine Suspendierung anfordert.

So ist der Punkt: Coroutines sind "kollaborativ". Selbst im Multicore-System läuft immer nur eine Coroutine (mehrere Threads können jedoch gleichzeitig ausgeführt werden). Zwischen den Koroutinen gibt es keine Präemptivierung, die laufende Coroutine muss die Ausführung explizit aufgeben.

Für "concurrency" können Sie Rob Pike siehe slide:

Concurrency die Zusammensetzung unabhängig Ausführung Berechnungen ist.

So während Koroutine A Hinrichtung, es geht die Steuerung B. nach einiger Zeit dann Koroutine, die Koroutine B Kontrolle zurück zu Koroutine A. passiert Da Abhängigkeit zwischen Koroutinen ist, und sie müssen in Tandem laufen, so sind die beiden Coroutinen nicht Nebenläufigkeit.

+0

Ich liebte diese Antwort, bis ich zum letzten Satz kam. Was heißt das? Haben Sie "Nebenläufigkeit" falsch geschrieben? Wenn dies der Fall ist, scheint diese Schlussfolgerung nicht der angegebenen Definition zu entsprechen. Oder soll das ein neues Wort "concurreny" sein? Was bedeutet dieses Wort? –

+0

@ ErickG.Hagstrom: Sorry, ich schrieb 'Nebenläufigkeit'. Warum glauben Sie, dass die Schlussfolgerung nicht der angegebenen Definition entspricht? –

+0

Coroutinen werden nicht unabhängig ausgeführt. Sie wechseln sich ab, jeder wartet darauf, dass der andere einen Teil der Arbeit erledigt. Sie koordinieren sich aktiv miteinander. Das ist das Gegenteil von Rob Pikes Definition von Nebenläufigkeit. –

6

Coroutine ist ähnlich wie Subroutine/Threads. Der Unterschied ist, sobald ein Aufrufer ein Unterprogramm/Threads aufgerufen hat, wird es nie zurück zur Aufruferfunktion zurückkehren. Aber eine Coroutine kann nach der Ausführung eines Stücks Code zurück zum Aufrufer, der es dem Aufrufer ermöglicht, einen Teil seines eigenen Codes auszuführen und zum Coroutine-Punkt zurückzukehren, wo die Ausführung gestoppt und von dort fortgesetzt wurde. dh. Ein Koroutine hat mehr als eine Ein- und Ausstiegspunkte

1

Auf einer anderen Note, in Python gevent Bibliothek ist eine coroutine basierte Netzwerk-Bibliothek, die Sie faden Funktionen wie async Netzwerkanforderungen, ohne den Aufwand zu erstellen und zu zerstören Threads gibt. Die verwendete coroutine Bibliothek ist greenlet.

0
  • Koroutinen sind große Funktionen, die in Kotlin Sprache
  • Koroutinen sind eine neue Art und Weise asynchron zu schreiben, nicht blockierende Code (und vieles mehr)
  • Coroutine sind leichte Fäden. Ein leichtgewichtiger Thread bedeutet, dass er nicht auf nativen Thread abbildet, so dass kein Kontextwechsel zwischen Prozessor erforderlich ist, damit sie schneller sind.
  • Es wird nicht auf nativen Thread zugeordnet
  • Coroutinen und die Threads sind beide Multitasking. Aber der Unterschied ist, dass Threads vom Betriebssystem und Coroutinen von den Benutzern verwaltet werden.

Grundsätzlich gibt es zwei Arten von Koroutinen:

  1. Stackless
  2. Stackful

Kotlin stackless Koroutinen implementiert - es bedeutet, dass die Koroutinen haben keine eigenen Stack, Daher werden sie nicht im nativen Thread zugeordnet.

Dies sind die Funktionen der Koroutine zu starten:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9