Sicherer Weg, Endlosschleifen-Goroutine zu beenden?
Ich habe eine Goroutine, die als Zuhörer fungiert. Der Eingabestream kommt in eine Art gepuffertes channel
,我希望我的 goroutine 处理传入该通道的数据。然而,有时 channel
可能会暂时没有数据输入。如果 channel
, das für eine Sekunde nichts zu bieten hat und ich möchte, dass meine Goroutine etwas anderes macht. Die Funktion sieht so aus:
func main () { var wg sync.WaitGroup arr := make([]*myObject, 0) wg.Add(1) go listener(c, arr, &wg) for { // sending stuff to c } } func listener(c chan *myObject, arr []*myObject, wg *sync.WaitGroup) { for { select { case value := <- c: arr = append(arr, value) case <- time.After(1 * time.Second): fmt.Println(arr) } }
Das Problem ist, dass ich alles gedruckt sehen möchte, was über diesen Kanal geht. Wenn die Position von main
突然结束,可能 arr
中还剩下一些东西还没有打印出来,我就看不到了。所以我需要确保这个goroutine在程序结束之前处理完通道中的所有数据。我认为,这意味着我需要使用 WaitGroup
并使用 Wait()
来确保程序在我的 goroutine 完成需要执行的操作之前不会关闭。 但我不知道在我的 WaitGroup
上调用 Done()
.
Grundsätzlich brauche ich eine sichere Möglichkeit, die Goroutine vor Programmende „anzuhalten“ und den Rest auszudrucken. Wie kann ich das machen?
Erschwerend kommt hinzu, dass ich für Dinge wie Unit-Tests selbst Daten an den Kanal sende und nach dem Senden einer bestimmten Menge das Array anzeigen möchte. Wenn ich jedoch nur das Array direkt nach dem Code überprüfe, der die Daten an den Kanal sendet, hatte die Goroutine möglicherweise noch keine Chance, alle Daten zu verarbeiten. In diesem Fall möchte ich warten, bis die Goroutine alle von mir gesendeten Daten verarbeitet hat, und sie dann anhalten und bitten, mir das Array anzuzeigen. Aber woher weiß ich, wann die Goroutine mit der Verarbeitung fertig ist? Ich könnte sleep
eine Weile warten, ihm eine Chance geben, fertig zu werden, und dann innehalten und es mir ansehen, aber das fühlt sich ziemlich kitschig an. Ich denke, es gibt eine Best-Practice-Methode, um dieses Problem zu lösen, aber ich habe es noch nicht herausgefunden.
Hier sind einige Ideen, die ich hatte, keine davon hat funktioniert.
in der Unendlichkeit
for
循环之外调用Done()
. Das funktioniert nicht, da der Code meines Wissens nicht zugänglich ist.Im Timeout
case
中调用Done()
. Dies funktioniert nicht, da nach dem Timeout möglicherweise weitere Daten unterwegs sind und ich möchte, dass meine Goroutine weiter zuhört.
Richtige Antwort
Ändern Sie den Hörer so, dass er zurückkehrt, wenn der Kanal geschlossen wird. Rufen Sie wg.Done() bei der Rückkehr auf:
func listener(c chan *myObject, arr []*myObject, wg *sync.WaitGroup) { defer wg.Done() for { select { case value, ok := <- c: if !ok { return } arr = append(arr, value) case <- time.After(1 * time.Second): fmt.Println(arr) } }
Ändern Sie main, um den Kanal zu schließen, nachdem der Versand abgeschlossen ist. Warten Sie, bis die Goroutine abgeschlossen ist, bevor Sie von der Hauptroutine zurückkehren.
var wg sync.WaitGroup arr := make([]*myObject, 0) wg.Add(1) go listener(c, arr, &wg) for { // sending stuff to c } close(c) wg.Wait()
Das obige ist der detaillierte Inhalt vonSicherer Weg, Endlosschleifen-Goroutine zu beenden?. 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 dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

In dem Artikel wird das Reflect -Paket von Go, das zur Laufzeitmanipulation von Code verwendet wird, von Vorteil für die Serialisierung, generische Programmierung und vieles mehr. Es warnt vor Leistungskosten wie langsamere Ausführung und höherer Speichergebrauch, beraten die vernünftige Verwendung und am besten am besten

In dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben
