2013-08-05 3 views

Antwort

29

Nicht ganz. Der Go FAQ-Bereich Why goroutines instead of threads? erklärt:

Goroutines sind Teil machen Gleichzeitigkeit einfach zu bedienen. Die Idee, die es schon seit einiger Zeit gibt, ist das Multiplexen von unabhängig ausgeführten Funktionen - Coroutinen - auf eine Menge von Threads.Wenn eine Coroutine blockiert, z. B. durch Aufrufen eines blockierenden Systemaufrufs, verschiebt die Laufzeit andere Coroutinen auf demselben Betriebssystem-Thread automatisch in einen anderen ausführbaren Thread, sodass sie nicht blockiert werden. Der Programmierer sieht nichts davon, worauf es ankommt. Das Ergebnis, das wir Göroutinen nennen, kann sehr billig sein: Wenn sie nicht viel Zeit in lang laufenden Systemaufrufen verbringen, kosten sie wenig mehr als den Speicher für den Stack, der nur ein paar Kilobyte beträgt.

Um die Stacks klein zu halten, verwendet die Laufzeit von Go segmentierte Stacks. Eine neu gemachte Goroutine erhält einige Kilobytes, was fast immer ausreicht. Wenn dies nicht der Fall ist, weist die Laufzeit Erweiterungssegmente automatisch zu (und gibt diese frei). Der Overhead beträgt ungefähr drei billige Anweisungen pro Funktionsaufruf. Es ist praktisch, Hunderttausende von Goroutines in demselben Adressraum zu erstellen. Wenn es sich bei Gououtines nur um Threads handelte, würden die Systemressourcen bei einer viel kleineren Anzahl ausgehen.

2

Goroutine ist ein separater "Thread" der Ausführung. Es ist IMO nicht wirklich vergleichbar mit einer Coroutine. In erster Näherung können Goroutinen durch echte OS-Threads implementiert werden. AFAIK, das war der Fall von frühen Versionen von gccgo. Ein weiterer Unterschied ist, dass Göroutinen ausgeschlossen werden können.

Current Go-Compiler implementieren Goroutines als sehr leichtgewichtige Benutzer-Space-Threads. Ein eindeutiges Merkmal z. green threads ist, dass goroutines auf verschiedene OS-Threads geschaltet werden können.

Ich glaube, Sie einige verwandte Bits von Interesse finden Sie hier: proc.c

+0

Was bedeutet "ausgeschlossen"? –

+0

@ Sławosz: Siehe http://en.wikipedia.org/wiki/Preemption_(computing). Kurz gesagt, es gibt kooperative Planung (Korotinen, Ertrag, ...) und präventive Planung (OS-Threads, Goroutine, ...) – zzzz

+1

Ich glaube nicht, dass Göroutinen präventiv geplant sind. Ich dachte, dass Göroutinen nur bestimmte Punkte haben, an denen sie sich mit dem Scheduler für einen möglichen Kontextwechsel einchecken (z. B. bei Funktionsaufrufen, bei I/O usw.). – weberc2

37

IMO, eine Coroutine impliziert die Unterstützung von explizite Mittel für die Übertragung der Kontrolle auf eine andere Coroutine. Das heißt, der Programmierer programmiert eine Coroutine auf eine Art und Weise, wenn sie entscheidet, wann eine Coroutine die Ausführung unterbrechen sollte und ihre Kontrolle einer anderen Coroutine übergeben soll (entweder durch Aufrufen oder durch Zurückgeben/Verlassen (üblicherweise als Nachgeben bezeichnet).

Go „goroutines“ sind eine andere Sache: sie implizit Gabe Kontrolle bei bestimmten unbestimmt Punkte , die passieren, wenn die goroutine etwa ist wie I/O-Abschluss, Kanal send auf einige (extern) Ressource schlafen usw. Dieser Ansatz in Verbindung mit dem Teilen des Zustands über Kanäle ermöglicht es dem Programmierer, die Programmlogik als einen Satz aufeinanderfolgender leichter Prozesse zu schreiben, die das Spaghetti-Code-Problem sowohl bei koroutine- als auch bei ereignisbasierten Ansätzen beseitigt.

In Bezug auf die Umsetzung, ich glaube, sie ganz ähnlich sind zu der (leider nicht allzu gut bekannt) "State Threads" library, nur ganz niedrigerer Ebene (wie Go nicht wie diese auf libc oder Dinge angewiesen und spricht direkt an die OS Kernel) — Sie könnten das Einführungsdokument für die ST-Bibliothek lesen, wo das Konzept ziemlich gut erklärt wird.


In der Tat sind diese Punkte weniger bestimmt als die von Koroutinen aber bestimmtere als bei echten OS Threads unter preemptive multitasking, wobei jeder Faden könnte durch den Kern zu einem bestimmten Zeitpunkt unterbrochen werden, und in der Ablauf der Steuerung des Threads.