Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah terdapat kemungkinan panik di sini?

Adakah terdapat kemungkinan panik di sini?

WBOY
WBOYke hadapan
2024-02-05 21:36:111139semak imbas

Adakah terdapat kemungkinan panik di sini?

Kandungan soalan

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

Mungkinkah saya akan panik apabila branch1 berlaku antara line2 dan line3.


Jawapan Betul


Ya, panik mungkin. Di bawah ialah contoh garis masa di mana panik berlaku. Baris disusun mengikut urutan masa menaik. N: awalan bermaksud goroutine.

1: Mulakan coroutine 2
2: Panggil ctx.Err(), ia mengembalikan sifar
1: Panggil cancelFunc()
1: Tutup saluran anis
2: Hantar ke saluran aniy. Panik kerana saluran ditutup.

Atas ialah kandungan terperinci Adakah terdapat kemungkinan panik di sini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam