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 } } }
Ist es möglich, dass ich in Panik gerate, wenn Verzweigung 1 zwischen Leitung 2 und Leitung 3 auftritt?
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!