English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Go bietet eine spezielle Funktion namens Goroutines. Eine Goroutine ist eineFunktionoder Methode, kann unabhängig und gleichzeitig mit jeder anderen Goroutine im Programm ausgeführt werden. Mit anderen Worten, jede gleichzeitig ausgeführte Aktivität in Go wird als Goroutine bezeichnet, und Sie können Goroutine als leichte Threads betrachten. Im Vergleich zu Threads ist der Aufwand für die Erstellung von Goroutines sehr gering. Jedes Programm enthält mindestens eine Goroutine, und diese Goroutine wirdHaupt-Goroutine. Wenn der Haupt-Goroutine abbricht und alle Goroutine unter dem Haupt-Goroutine ausgeführt werden, dann beenden sich alle Goroutine im Programm; Goroutine laufen immer im Hintergrund.
Sie müssen nur das Schlüsselwort "go" als Präfix für den Funktions- oder Methodenaufruf verwenden, um Ihre eigene Goroutine zu erstellen, wie in der folgenden Syntax gezeigt:
Syntax:
func name() { // Anweisung } // Vor dem Funktionsnamen verwenden Sie den Schlüsselwort "go", um Ihre eigene Goroutine zu erstellen, wie in der folgenden Syntax gezeigt: go name()
package main import "fmt" func display(str string) { for w := 0; 6; w++ { fmt.Println(str) } } func main() { // Aufruf einer Goroutine go display("Willkommen") //normalen Funktionsaufruf display("oldtoolbag.com) }
Ausgabe:
oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com
In diesem Beispiel haben wir nurdisplay()Funktion, und diese Funktion auf zwei verschiedene Weisen aufrufen, nämlich durch eine Goroutine, d.h. go display("Welcome") und durch einen normalen Funktionsaufruf, d.h. display("w3codebox)
Allerdings könnten Sie ein Problem bemerken, es zeigt nur das Ergebnis einer normalen Funktion an, aber nicht das einer Goroutine, weil der Aufruf einer neuen Goroutine sofort zurückgibt. Es wartet nicht wie eine normale Funktion auf das Ende der Goroutine, sondern geht sofort zum nächsten Zeilenabschnitt weiter und ignoriert den Wert, der von der Goroutine zurückgegeben wird. Daher haben wir einige Änderungen an der Programmstruktur vorgenommen, wie im folgenden Code gezeigt:
Geänderte Beispiel für Goroutine:
package main import ( "fmt" "time" ) func display(str string) { for w := 0; 6; w++ { time.Sleep(1 * time.Second) fmt.Println(str) } } func main() { // Aufruf einer Goroutine go display("Willkommen") //Aufruf einer normalen Funktion display("w3codebox) }
Ausgabe:
Willkommen w3codebox w3codebox Willkommen Willkommen w3codebox w3codebox Willkommen Willkommen w3codebox w3codebox
Wir haben die Sleep()-Methode in unser Programm aufgenommen, die die Hauptgoroutine dazu bringt, während der Ausführung der neuen Goroutine zu warten.1Sekunden schlafen geht1Sekunden, die Begrüßung auf dem Bildschirm anzeigt und dann1Sekunden wird die Hauptgoroutine neu geplant und ausgeführt und dann beendet. Dieser Prozess setzt sich fort, bis der Wert von z <6Danach wird die Hauptgoroutine beendet. Hier arbeiten Goroutine und normale Funktionen gleichzeitig.
Goroutines haben einen geringeren Overhead als Threads.
Goroutines werden im Stack gespeichert und der Stack kann entsprechend den Anforderungen des Programms wachsen und schrumpfen. Aber im Thread ist die Größe des Stacks fest.
Goroutines können über Kanäle kommunizieren, und diese Kanäle sind speziell gestaltet, um Konflikte zu vermeiden, die bei der Verwendung von Goroutines beim Zugriff auf gemeinsamen Speicher auftreten können.
Angenommen, ein Programm hat einen Thread und dieser Thread hat viele damit verbundene Goroutines. Wenn eine Goroutine aufgrund von Ressourcenanforderungen blockiert, werden alle übrigen Goroutines einer neu erstellten OS-Thread zugewiesen. Alle diese Details sind dem Programmierer verborgen.
In Go können Sie auch für anonyme Funktionen Goroutines starten, d.h. Sie können einfach durch die Verwendung des Schlüsselworts "go" als Präfix der Funktion eine anonyme Goroutine erstellen, wie im folgenden Syntax gezeigt:
Syntax:
//Aufruf einer anonymen Funktion go func(parameter_list){ // Anweisung )(arguments)
package main import ( "fmt" "time" ) func main() { fmt.Println("Willkommen!! zu Hauptfunktion") //Erstellen Sie eine anonyme Goroutine go func() { fmt.Println("Willkommen!! zu oldtoolbag.com) }) time.Sleep(1 * time.Second) fmt.Println("GoodBye!! zu Hauptfunktion") }
Ausgabe:
Willkommen!! zu Hauptfunktion Willkommen!! zu oldtoolbag.com GoodBye!! zu Hauptfunktion