


Probleme bei der Verwendung von Kanälen zur Weitergabe von Daten von einer Goroutine an eine andere
Feb 08, 2024 pm 11:21 PMBei der gleichzeitigen Programmierung in der Go-Sprache ist die Verwendung von Kanälen eine gängige Methode zum Übertragen von Daten zwischen verschiedenen Goroutinen. Bei der Übergabe von Daten von einer Goroutine an eine andere können jedoch einige Probleme auftreten. Der PHP-Editor Apple stellt diese Probleme vor und stellt in diesem Artikel Lösungen bereit, damit Sie die Schwierigkeiten, die bei der Verwendung von Kanälen in der gleichzeitigen Programmierung auftreten können, besser verstehen und bewältigen können.
Frageninhalt
Ich konnte den folgenden Code entwickeln, der mithilfe von Go-Kanälen Daten von einer Routine zur anderen weitergeben soll:
package main import ( "fmt" "sync" ) func generateNumbers(total int, wg *sync.WaitGroup) { defer wg.Done() ch :=make(chan int) sum :=0 for idx := 1; idx <= total; idx++ { fmt.Printf("Generating number %d\n", idx) sum =sum+idx ch <- sum } } func printNumbers(wg *sync.WaitGroup, ch chan int) { defer wg.Done() fmt.Printf("Sum is now",ch) for idx := 1; idx <= 3; idx++ { fmt.Printf("Printing number %d\n", idx) } } func main() { var wg sync.WaitGroup ch1 :=make(chan int) wg.Add(2) go printNumbers(&wg,ch1) go generateNumbers(3, &wg) fmt.Println("Waiting for goroutines to finish...") wg.Wait() fmt.Println("Done!") }
Ich versuche, Daten (Wert von Sum ) von der GenerateNumbers-Routine an die PrintNumbers-Routine zu übergeben.
Aber ich bin auf folgendes Problem gestoßen:
Waiting for goroutines to finish... Generating number 1 Sum is now%!(EXTRA chan int=0xc000102060)Printing number 1 Printing number 2 Printing number 3 fatal error: all goroutines are asleep - deadlock! goroutine 1 [semacquire]: sync.runtime_Semacquire(0xc000118270?) /usr/local/go/src/runtime/sema.go:62 +0x27 sync.(*WaitGroup).Wait(0x4ba3a8?) /usr/local/go/src/sync/waitgroup.go:116 +0x4b main.main() /tmp/tgPhZuPV77.go:42 +0x12f goroutine 19 [chan send]: main.generateNumbers(0x3, 0x0?) /tmp/tgPhZuPV77.go:19 +0xf2 created by main.main /tmp/tgPhZuPV77.go:39 +0xe5 exit status 2
Bitte helfen Sie, ich bin neu bei Golang.
Lösung
Es gibt einige Fehler im oben genannten Programm.
- Die beiden Funktionen printNumbers und genericNumbers müssen dieselbe Chan-Variable verwenden.
- Sie sollten die Daten der Chan-Variablen von ch lesen.
- Die Funktion „generateNumbers“ sollte Chan-Variablen nicht wiederholt deklarieren und erstellen.
Ich habe den obigen Code wie folgt geändert:
func generateNumbers(total int, wg *sync.WaitGroup, ch chan int) { defer wg.Done() sum := 0 for idx := 1; idx <= total; idx++ { fmt.Printf("Generating number %d\n", idx) sum = sum + idx ch <- sum } } func printNumbers(wg *sync.WaitGroup, ch chan int) { defer wg.Done() fmt.Printf("Sum is now:\n") for idx := 1; idx <= 3; idx++ { sum := <-ch fmt.Printf("Printing number %d %d\n", idx, sum) } } func main() { var wg sync.WaitGroup ch1 := make(chan int) wg.Add(2) go printNumbers(&wg, ch1) go generateNumbers(3, &wg, ch1) fmt.Println("Waiting for goroutines to finish...") wg.Wait() fmt.Println("Done!") }
Das obige ist der detaillierte Inhalt vonProbleme bei der Verwendung von Kanälen zur Weitergabe von Daten von einer Goroutine an eine andere. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

So verwenden Sie Reflection, um auf private Felder und Methoden in Golang zuzugreifen

Tipps zum dynamischen Erstellen neuer Funktionen in Golang-Funktionen

Der Unterschied zwischen Leistungstests und Unit-Tests in der Go-Sprache

Auf welche Fallstricke sollten wir beim Entwurf verteilter Systeme mit Golang-Technologie achten?

Golang-Technologiebibliotheken und Tools für maschinelles Lernen

Die Entwicklung der Benennungskonvention für Golang-Funktionen

Die Rolle der Golang-Technologie in der mobilen IoT-Entwicklung

Können Golang-Variablenparameter für Funktionsrückgabewerte verwendet werden?
