Bitten Sie Go, alle Goroutinen auszuführen, bevor Sie fortfahren
Bei der gleichzeitigen Programmierung stoßen wir oft auf Situationen, in denen wir warten müssen, bis alle Goroutinen abgeschlossen sind, bevor wir mit der Ausführung fortfahren. In der Go-Sprache können wir dieses Ziel erreichen, indem wir WaitGroup verwenden. WaitGroup ist ein Zählsemaphor, mit dem auf den Abschluss einer Gruppe von Goroutinen gewartet werden kann. Bevor wir fortfahren, müssen wir die Wait-Methode von WaitGroup aufrufen, um sicherzustellen, dass alle Goroutinen ihre Aufgaben abgeschlossen haben. In diesem Artikel stellen wir vor, wie WaitGroup korrekt zum Verwalten der Ausführungsreihenfolge von Goroutinen verwendet wird.
Frageninhalt
Ich benötige den Golang-Scheduler, um alle Goroutinen auszuführen, bevor ich fortfahre. runtime.gosched() kann das Problem nicht lösen.
Das Problem ist, dass die Go-Routine so schnell läuft, dass das „select“ in start() nach dem „select“ in stopstream() ausgeführt wird und dann „case <-chanstopstream:“ der Empfänger nicht für den Sender „case“ bereit ist retchan <-true:". Es stellt sich heraus, dass in diesem Fall das gleiche Verhalten auftritt wie wenn stopstream() hängt
Führen Sie diesen Code aus https://go.dev/play/p/dq85xqju2q_z Oft werden Sie diese beiden Antworten sehen Erwartete Antwort, wenn nicht suspendiert:
2009/11/10 23:00:00 start 2009/11/10 23:00:00 receive chan 2009/11/10 23:00:03 end
Erwartete Reaktion bei Suspendierung, aber nicht so schnell bei Suspendierung:
2009/11/10 23:00:00 start 2009/11/10 23:00:00 default 2009/11/10 23:00:01 timer 2009/11/10 23:00:04 end
Code
package main import ( "log" "runtime" "sync" "time" ) var wg sync.WaitGroup func main() { wg.Add(1) //run multiples routines on a huge system go start() wg.Wait() } func start() { log.Println("Start") chanStopStream := make(chan bool) go stopStream(chanStopStream) select { case <-chanStopStream: log.Println("receive chan") case <-time.After(time.Second): //if stopStream hangs do not wait more than 1 second log.Println("TIMER") //call some crash alert } time.Sleep(3 * time.Second) log.Println("end") wg.Done() } func stopStream(retChan chan bool) { //do some work that can be faster then caller or not runtime.Gosched() //time.Sleep(time.Microsecond) //better solution then runtime.Gosched() //time.Sleep(2 * time.Second) //simulate when this routine hangs more than 1 second select { case retChan <- true: default: //select/default is used because if the caller times out this routine will hangs forever log.Println("default") } }
Workaround
Es gibt keine Möglichkeit, alle anderen Goroutinen auszuführen, bevor die Ausführung der aktuellen Goroutine fortgesetzt wird.
Das Problem wurde behoben, indem sichergestellt wurde, dass die Goroutine nicht blockiert stopstream
:
Option 1: Ändern Sie chanstopstream
in gepufferter Kanal chanstopstream
更改为缓冲通道。这确保了 stopstream
. Dadurch wird sichergestellt, dass
func start() { log.println("start") chanstopstream := make(chan bool, 1) // <--- buffered channel go stopstream(chanstopstream) ... } func stopstream(retchan chan bool) { ... // always send. no select/default needed. retchan <- true }
Option 2
: Schließen Sie den Kanal, anstatt den Wert zu senden. Kanäle können jederzeit vom Absender geschlossen werden. Empfängt einen Nullwert auf einem geschlossenen Kanal, der den Kanalwerttyp zurückgibt.
func start() { log.Println("Start") chanStopStream := make(chan bool) // buffered channel not required go stopStream(chanStopStream) ... func stopStream(retChan chan bool) { ... close(retChan) }
Das obige ist der detaillierte Inhalt vonBitten Sie Go, alle Goroutinen auszuführen, bevor Sie fortfahren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

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



In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Go Zeigersyntax und Probleme bei der Verwendung der Viper -Bibliothek bei der Programmierung in Go -Sprache. Es ist entscheidend, die Syntax und Verwendung von Zeigern zu verstehen, insbesondere in ...
