Besteht hier die Möglichkeit einer Panik?

WBOY
Freigeben: 2024-02-05 21:36:11
nach vorne
1141 Leute haben es durchsucht

Besteht hier die Möglichkeit einer Panik?

Frageninhalt

func main() {
    rand.Seed(time.Now().Unix())
    ctx, cancelFunc := context.WithCancel(context.Background())
    anies := make(chan any)
    go doSomething(ctx, anies)
    intn := rand.Intn(2)
    if intn == 0 { //BRANCH1
        cancelFunc()
        close(anies) 
    }
    time.Sleep(time.Second)
}

func doSomething(ctx context.Context, anies chan any) {
    for {
         if ctx.Err() == nil { //LINE2
            anies <- 1 //LINE3
        }
    }
}
Nach dem Login kopieren

Ist es möglich, dass ich in Panik gerate, wenn Verzweigung 1 zwischen Leitung 2 und Leitung 3 auftritt?


Richtige Antwort


Ja, Panik ist möglich. Unten sehen Sie ein Beispiel für eine Zeitleiste, in der eine Panik auftritt. Die Zeilen sind in aufsteigender Reihenfolge der Zeit angeordnet. N: Präfix steht für Goroutine.

1: Coroutine 2 starten
2: Rufen Sie ctx.Err() auf, es gibt Null zurück
1: cancelFunc()
aufrufen 1: Kanal schließen
2: An einen beliebigen Kanal senden. Panik, weil der Kanal geschlossen ist.

Das obige ist der detaillierte Inhalt vonBesteht hier die Möglichkeit einer Panik?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage