Heim >Backend-Entwicklung >Golang >Warum wird mein Goroutine-Timeout-Fall bei der Verwendung von Kanälen nicht ausgeführt?

Warum wird mein Goroutine-Timeout-Fall bei der Verwendung von Kanälen nicht ausgeführt?

Linda Hamilton
Linda HamiltonOriginal
2024-12-19 10:03:08774Durchsuche

Why Doesn't My Goroutine Timeout Case Execute When Using Channels?

Timeout-Fall wird in GoroutineChannels nicht ausgeführt

In einem Codeausschnitt mit Goroutinen und Kanälen stößt ein Benutzer auf eine rätselhafte Situation, in der der Timeout-Fall auftritt Eine Select-Anweisung bleibt nicht ausgeführt.

Der bereitgestellte Code erstellt zwei Goroutinen, eine zum Senden sendet alle 1,5 Sekunden Werte an einen Kanal und ein anderer wartet auf Werte oder löst nach 2 Sekunden einen Timeout aus. Der Timeout-Fall tritt jedoch nie ein.

Warum wird dieses Verhalten beobachtet?

Der Schlüssel liegt in der wiederholten Erstellung des Timeout-Kanals in jeder Iteration der Auswahlschleife. Jedes Mal, wenn ein Wert vom c1-Kanal empfangen wird, wird von time.After() ein neuer Kanal generiert. Dieser neue Kanal erhält nach weiteren 2 Sekunden einen Wert, der vorherige Timeout-Kanal wird jedoch obsolet. Daher kann der Timeout-Fall niemals ausgeführt werden.

Um dieses Problem zu beheben und sicherzustellen, dass das Timeout wie erwartet auftritt, erstellen Sie den Timeout-Kanal nur einmal vor der Auswahlschleife. Dadurch bleibt der Kanal während der gesamten Programmausführung aktiv und der Timeout-Fall wird nach 2 Sekunden Inaktivität auf dem c1-Kanal ausgelöst.

Das obige ist der detaillierte Inhalt vonWarum wird mein Goroutine-Timeout-Fall bei der Verwendung von Kanälen nicht ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn