


Stoppen Sie eine Goroutine, die auf unbestimmte Zeit in einen Kanal schreibt
Ich habe eine Funktion, die eine Goroutine erstellt, die einen Kanal auf unbestimmte Zeit füllt, zum Beispiel:
func foo() <-chan int { ch := make(chan int) go func() { defer close(ch) for { ch <- 1 } }() return ch }
Angenommen, wir haben einen Verbraucher, den wir nach einer bestimmten Zeit stoppen möchten:
ch:=foo() <-ch <-ch // done
Jetzt möchte ich Goroutine-Ressourcen bereinigen, einschließlich Kanälen. Ich habe versucht, dafür einen „Abschluss“-Kanal hinzuzufügen, bin dann aber in eine Sackgasse geraten:
func Foo() (<-chan int, chan<- bool) { ch := make(chan int) done := make(chan bool) go func() { defer close(ch) for { select { case <-done: return default: ch <- 1 } } }() return ch, done } func main() { ch, done := Foo() <-ch <-ch done <- true // HERE }
Jetzt scheint es zu funktionieren, aber nur, weil das Programm beendet wird, wenn ich es durch einige io-Operationen ersetze // here
(例如:http.get(“http://google.com”)
) ,我面临死锁(fatal 错误:所有 goroutine 都在睡觉 - 死锁!
).
Ich frage mich, ob es eine andere Möglichkeit gibt, die von der Funktion foo
generierten Goroutinen und Kanäle zu bereinigen. foo
函数创建的生成的 goroutine 和通道。
正确答案
只需在启动的 goroutine 中将 default
替换为 case
Richtige Antwort
default
Ersetzen Sie einfach
case
in der Start-Goroutine: - Der Grund, warum der ursprüngliche Code in der
done
通道时,启动的写入ch
通道的 goroutines 会立即转到default
情况。然后 goroutine 会阻塞在ch <- 1
行,直到其他 goroutine 从ch
-Situation blockiert ist, ist wie folgt: -
ch
读取两次。这会导致在启动的 goroutine 处有两个成功的执行循环。然后它尝试写入done
。此时启动的goroutine可能已经检查了select
语句,陷入default
情况并阻塞在ch <- 1
行。因此主 goroutine 也会无限期地阻塞在done <- true
Eine Goroutine, die das Schreiben in einench
-Kanal initiiert hat, geht sofort in den -Fall über, wenn keine anderen gleichzeitig laufenden Goroutinen in den
func Foo() (<-chan int, chan<- bool) { ch := make(chan int) done := make(chan bool) go func() { defer close(ch) for { select { case <-done: return case ch <- 1: } } }() return ch, done }
done
-Kanal schreiben. Die Goroutine blockiert dann die Zeile ch <- 1
, bis eine andere Goroutine den Wert von ch
liest.
🎜Die Hauptcoroutine liest zweimal aus ch
. Dies führt zu zwei erfolgreichen Ausführungsschleifen bei der gestarteten Goroutine. Anschließend wird versucht, done
zu schreiben. Die zu diesem Zeitpunkt gestartete Goroutine hat möglicherweise die select
-Anweisung überprüft, ist in die 🎜-Situation geraten und hat an der Zeile ch <- 1
blockiert. Daher blockiert die Haupt-Goroutine auch auf unbestimmte Zeit die Zeile done <- true
. Dies kann zu einem Deadlock führen. 🎜
🎜Das obige ist der detaillierte Inhalt vonStoppen Sie eine Goroutine, die auf unbestimmte Zeit in einen Kanal schreibt. 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

Dieser Artikel erläutert die Paketimportmechanismen von Go: benannte Importe (z. B. importieren & quot; fmt & quot;) und leere Importe (z. B. Import _ & quot; fmt & quot;). Benannte Importe machen Paketinhalte zugänglich, während leere Importe nur T ausführen

In diesem Artikel werden die Newflash () -Funktion von BeEGO für die Übertragung zwischen PAGE in Webanwendungen erläutert. Es konzentriert sich auf die Verwendung von Newflash (), um temporäre Nachrichten (Erfolg, Fehler, Warnung) zwischen den Controllern anzuzeigen und den Sitzungsmechanismus zu nutzen. Limita

Dieser Artikel beschreibt die effiziente Konvertierung von MySQL -Abfrageergebnissen in GO -Strukturscheiben. Es wird unter Verwendung der SCAN -Methode von Datenbank/SQL zur optimalen Leistung hervorgehoben, wobei die manuelle Parsen vermieden wird. Best Practices für die Struktur -Feldzuordnung mithilfe von DB -Tags und Robus

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

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

Dieser Artikel beschreibt effizientes Dateischreiben in Go und vergleicht OS.WriteFile (geeignet für kleine Dateien) mit OS.openfile und gepufferter Schreibvorgänge (optimal für große Dateien). Es betont eine robuste Fehlerbehandlung, die Verwendung von Aufschub und Überprüfung auf bestimmte Fehler.

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

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
