Die Go-Sprache bietet eine spezielle Funktion, die als Goroutinen bekannt ist. Eine Goroutine ist eine Funktion oder Methode, die unabhängig und gleichzeitig in Verbindung mit anderen in Ihrem Programm vorhandenen Goroutinen ausgeführt wird. Oder mit anderen Worten, jede gleichzeitig ausgeführte Aktivität in der Go-Sprache wird als Goroutinen bezeichnet. Sie können eine Goroutine wie einen leichten Faden betrachten. Die Kosten für die Erstellung von Goroutinen sind im Vergleich zum Thread sehr gering. Jedes Programm enthält mindestens eine einzelne Goroutine, und diese Goroutine wird als Haupt-Goroutine bezeichnet . Alle Goroutinen arbeiten unter den Haupt-Goroutinen, wenn die Haupt-Goroutine beendet wird, dann werden auch alle im Programm vorhandenen Goroutinen beendet. Goroutine arbeitet immer im Hintergrund.

Wie erstelle ich eine Goroutine?

Sie können Ihre eigene Goroutine erstellen, indem Sie einfach das Schlüsselwort go als Präfix für den Funktions- oder Methodenaufruf verwenden, wie in der folgenden Syntax gezeigt:

Syntax:

func name(){
// statements
}

// using go keyword as the 
// prefix of your function call
go name()

Beispiel:

// Go program to illustrate
// the concept of Goroutine
package main
  
import "fmt"
  
func display(str string) {
    for w := 0; w < 6; w++ {
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Ausgabe:

GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks

Im obigen Beispiel erstellen wir einfach eine display()- Funktion und rufen diese Funktion dann auf zwei verschiedene Arten auf. Erstens ist eine eine Goroutine, dh go display("Welcome") und eine andere ist eine normale Funktion, dh display("GeeksforGeeks" ) . Aber es gibt ein Problem, es zeigt nur das Ergebnis der normalen Funktion an, die nicht das Ergebnis von Goroutine anzeigt, denn wenn eine neue Goroutine ausgeführt wird, kehrt der Goroutine-Aufruf sofort zurück. Die Steuerung wartet nicht darauf, dass die Goroutine ihre Ausführung abschließt, genau wie bei einer normalen Funktion, sie bewegt sich nach dem Goroutine-Aufruf immer zur nächsten Zeile und ignoriert den von der Goroutine zurückgegebenen Wert. Um eine Goroutine richtig auszuführen, haben wir also einige Änderungen an unserem Programm vorgenommen, wie im folgenden Code gezeigt:

Modifiziertes Beispiel:

// Go program to illustrate the concept of Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
func display(str string) {
    for w := 0; w < 6; w++ {
        time.Sleep(1 * time.Second)
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Ausgabe:

Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks

Wir haben die Sleep()-Methode in unser Programm eingefügt, die die Haupt-Goroutine für 1 Sekunde in den Ruhezustand versetzt, während 1 Sekunde die neue Goroutine ausgeführt wird, „ Willkommen “ auf dem Bildschirm anzeigt und dann nach 1 Sekunde Haupt-Goroutine neu geplant und beendet wird seinen Betrieb durchführen. Dieser Prozess wird fortgesetzt, bis der Wert von z < 6 ist, danach wird die Haupt-Goroutine beendet. Hier arbeiten sowohl Goroutine als auch die normale Funktion gleichzeitig.

Vorteile von Goroutinen

  • Goroutinen sind billiger als Threads.
  • Goroutinen werden im Stapel gespeichert und die Größe des Stapels kann entsprechend den Anforderungen des Programms wachsen und schrumpfen. Aber in Threads ist die Größe des Stapels festgelegt.
  • Goroutinen können unter Verwendung des Kanals kommunizieren, und diese Kanäle sind speziell dafür ausgelegt, Race-Conditions zu verhindern, wenn mit Goroutinen auf gemeinsam genutzten Speicher zugegriffen wird.
  • Angenommen, ein Programm hat einen Thread, und diesem Thread sind viele Goroutinen zugeordnet. Wenn eine der Goroutinen den Thread aufgrund von Ressourcenanforderungen blockiert, werden alle verbleibenden Goroutinen einem neu erstellten OS-Thread zugewiesen. All diese Details bleiben den Programmierern verborgen.

Anonyme Goroutine

In der Sprache Go können Sie Goroutine auch für eine anonyme Funktion starten oder mit anderen Worten, Sie können eine anonyme Goroutine erstellen, indem Sie einfach das Schlüsselwort go als Präfix dieser Funktion verwenden, wie in der folgenden Syntax gezeigt:

Syntax:

// Anonymous function call
go func (parameter_list){
// statement
}(arguments)

Beispiel:

// Go program to illustrate how
// to create an anonymous Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
// Main function
func main() {
  
    fmt.Println("Welcome!! to Main function")
  
    // Creating Anonymous Goroutine
    go func() {
  
        fmt.Println("Welcome!! to GeeksforGeeks")
    }()
  
    time.Sleep(1 * time.Second)
    fmt.Println("GoodBye!! to Main function")
}

Ausgabe:

Welcome!! to Main function
Welcome!! to GeeksforGeeks
GoodBye!! to Main function