Heim  >  Artikel  >  Backend-Entwicklung  >  Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

PHPz
PHPznach vorne
2024-02-09 23:36:091171Durchsuche

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde? Dies ist ein Problem, auf das viele Golang-Entwickler häufig stoßen, wenn sie Timer verwenden. Timer ist ein in Golang häufig verwendetes Werkzeug, mit dem nach einer bestimmten Zeit bestimmte Vorgänge ausgeführt werden. Manchmal erhalten wir jedoch auch dann Nachrichten vom Kanal, wenn wir den Timer explizit stoppen. Was genau verursacht dies? In diesem Artikel wird der PHP-Editor Zimo diese Frage ausführlich beantworten und entsprechende Lösungen bereitstellen.

Frageninhalt

Erster Code (Ausnahme):

var ti time.timer
func init() {
    ti = *time.newtimer(3 * time.second)
}
func main() {
    ti.stop()
    t := <-ti.c
    fmt.println("end", t) 
}

Zweiter Code (normal):

var ti *time.Timer
func init() {
    ti = time.NewTimer(3 * time.Second)
}
func main() {
    ti.Stop()
    t := <-ti.C
    fmt.Println("End", t) // deadlock!
}

Ich verstehe nicht, warum der erste Code nach dem Stoppen immer noch Nachrichten vom Timer-Kanal erhält. Ich glaube nicht, dass das normal ist, da es den Timer scheinbar unbrauchbar macht.

Der zweite Code ist normal, der Unterschied ist „var ti time.timer“ und „var ti *time.timer“, einer ist ein Wert und der andere ist ein Zeiger.

Ich kenne mich mit Hinweisen nicht aus, kann mir jemand helfen?

Danke!

Problemumgehung

Sie dereferenzieren den Ticker und sein Wert wird kopiert.

So stoppen Sie:

func (t *Ticker) Stop() {
    stopTimer(&t.r)
}

Wenn Sie einen Timer kopieren, &t.r zeigt er an eine andere Stelle. Deshalb stoppt Ihr Timer nicht.

Du solltest also *time.ticker 而不是 time.ticker verwenden.

Das obige ist der detaillierte Inhalt vonGolang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen