Heim >Backend-Entwicklung >Golang >Besteht hier die Möglichkeit einer Panik?

Besteht hier die Möglichkeit einer Panik?

WBOY
WBOYnach vorne
2024-02-05 21:36:111161Durchsuche

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
        }
    }
}

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!

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