Heim >häufiges Problem >Was ist Coroutine in Golang?

Was ist Coroutine in Golang?

小老鼠
小老鼠Original
2023-06-20 16:16:421051Durchsuche

Die Coroutine in Golang ist Goroutine. Der Unterschied besteht darin, dass Golang die Goroutine-Planung in vielen Aspekten wie Laufzeit und Systemaufrufen kapselt und verarbeitet. Wenn eine langfristige Ausführung oder Systemaufrufe auftreten, wird die CPU der aktuellen Goroutine diese aktiv übertragen aus, damit andere Goroutinen geplant und ausgeführt werden können. Sie können eine Coroutine erstellen, indem Sie das Schlüsselwort go vor einer Funktion oder Methode hinzufügen.

Was ist Coroutine in Golang?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, go1.20.1-Version, Dell G3-Computer.

Bei Coroutinen (Threads auf Benutzerebene) ist dies für den Kernel transparent, das heißt, das System kennt die Existenz von Coroutinen nicht und wird vollständig vom Esel-eigenen Programm geplant, da es vom Benutzerprogramm selbst gesteuert wird Dann ist es schwierig, die CPU-Steuerung zu erzwingen, um auf andere Prozesse/Threads umzuschalten. Normalerweise kann nur eine kollaborative Planung durchgeführt werden, bevor andere Coroutinen ausgeführt werden können.

Der Unterschied zwischen Go-Routine und Coroutine

Im Wesentlichen ist Goroutine Coroutine. Der Unterschied besteht darin, dass Golang die Goroutine-Planung in vielen Aspekten wie Laufzeit und Systemaufrufen kapselt und verarbeitet. Bei langfristiger Ausführung oder Systemaufrufen wird die CPU (P) der aktuellen Goroutine aktiv übertragen geplant und ausgeführt, was bedeutet, dass Golang Coroutinen auf Sprachebene unterstützt. Ein Hauptmerkmal von Golang ist die native Unterstützung von Coroutinen auf Sprachebene. Sie können eine Coroutine erstellen, indem Sie das Schlüsselwort go vor einer Funktion oder Methode hinzufügen.

Vergleiche in anderen Aspekten

1. In Bezug auf den Speicherverbrauch

Jede Go-Routine (Coroutine) belegt standardmäßig weit weniger Speicher als Java- und C-Threads.

go-Routine 2KB.

Thread: 8 MB.

2. In Bezug auf den Planungsaufwand für den Wechsel zwischen Threads und Go-Routine

In Bezug auf den Thread-/Go-Routine-Umschaltaufwand ist Go-Routine weitaus kleiner als Threads.

Thread: beinhaltet Modusumschaltung (Umschaltung vom Benutzermodus in den Kernelmodus), Aktualisierung von 16 Registern, PC, SP... und anderen Registern usw.

go-Routine: Nur drei Registerwerte werden geändert – PC/SP/DX.

2. Das zugrunde liegende Implementierungsprinzip von Coroutinen

Threads sind Kernelobjekte des Betriebssystems. Wenn es zu viele Threads gibt, kommt es zu häufigen Kontextwechseln, und diese CPU-Zeiten verursachen zusätzliche Kosten. Daher ist es bei einigen hochgradig gleichzeitigen Netzwerkserverprogrammierungen unklug, einen Thread zur Bereitstellung einer Socket-Verbindung zu verwenden. Das Betriebssystem stellt also ein asynchrones Programmiermodell bereit, das auf dem Ereignismuster basiert. Verwenden Sie eine kleine Anzahl von Threads, um eine große Anzahl von Netzwerkverbindungen und /0-Vorgängen zu bedienen. Allerdings erschwert die Verwendung asynchroner und ereignisbasierter Programmiermodelle das Schreiben von Programmcode und ist sehr fehleranfällig. Da Threads verschachtelt sind, erhöht sich auch die Schwierigkeit, Fehler zu beheben.

Coroutine ist ein Thread, der auf der Anwendungsebene simuliert wird. Er vermeidet die zusätzlichen Kosten für den Kontextwechsel und berücksichtigt die Vorteile von Multithreading. Vereinfacht die Komplexität hochgradig gleichzeitiger Programme. Beispielsweise ist in einem Netzwerkserver mit hoher Parallelität jeder Socket verbunden und der Server verwendet eine Coroutine, um ihn zu bedienen. Der Code ist sehr klar. Und es berücksichtigt die Leistung.

Das obige ist der detaillierte Inhalt vonWas ist Coroutine in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn