Einführung
Dieses Labor zielt darauf ab, Ihr Wissen über die Verwendung von Kanälen zur Synchronisierung der Ausführung zwischen Goroutines zu testen.
This tutorial is from open-source community. Access the source code
💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken
Dieses Labor zielt darauf ab, Ihr Wissen über die Verwendung von Kanälen zur Synchronisierung der Ausführung zwischen Goroutines zu testen.
Das Problem, das in diesem Labor gelöst werden soll, besteht darin, eine Goroutine zu erstellen, die eine bestimmte Aufgabe ausführt und eine andere Goroutine über einen Kanal benachrichtigt, wenn die Aufgabe abgeschlossen ist.
Um dieses Labor abzuschließen, müssen Sie Folgendes tun:
worker
, die einen Kanal vom Typ bool
als Parameter akzeptiert.worker
-Funktion führen Sie einige Arbeit durch und senden dann einen Wert an den Kanal, um zu signalisieren, dass die Arbeit abgeschlossen ist.main
-Funktion erstellen Sie einen Kanal vom Typ bool
mit einer Puffergröße von 1.worker
-Funktion aufruft und den Kanal als Parameter übergibt.main
-Funktion, bis ein Wert vom Kanal empfangen wird.$ go run channel-synchronization.go
working...done
## Wenn Sie die Zeile `<- done` aus diesem Programm entfernt hätten,
## würde das Programm bereits vor dem Start der `worker`-Goroutine beenden.
Hier ist der vollständige Code:
// Wir können Kanäle verwenden, um die Ausführung zwischen Goroutines zu synchronisieren.
// Hier ist ein Beispiel für die Verwendung eines blockierenden Empfangs, um auf das
// Ende einer Goroutine zu warten. Wenn Sie auf das Ende mehrerer Goroutines warten,
// können Sie stattdessen eine [WaitGroup](waitgroups) verwenden.
package main
import (
"fmt"
"time"
)
// Dies ist die Funktion, die wir in einer Goroutine ausführen werden. Der
// `done`-Kanal wird verwendet, um eine andere Goroutine zu benachrichtigen,
// dass die Arbeit dieser Funktion abgeschlossen ist.
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
// Senden Sie einen Wert, um zu signalisieren, dass wir fertig sind.
done <- true
}
func main() {
// Starten Sie eine worker-Goroutine und übergeben Sie ihr den Kanal,
// über den benachrichtigt werden soll.
done := make(chan bool, 1)
go worker(done)
// Blockieren Sie, bis wir eine Benachrichtigung von der worker-Goroutine
// über den Kanal erhalten.
<-done
}
In diesem Labor haben Sie gelernt, wie Sie Kanäle verwenden, um die Ausführung zwischen Goroutines zu synchronisieren. Indem Sie einen Kanal erstellen und an eine Goroutine übergeben, können Sie auf das Ende der Goroutine warten und benachrichtigt werden, wenn die Arbeit abgeschlossen ist.