Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghentikan Pelaksanaan Goroutine dengan Betul Selepas Tamat Masa dalam Perjalanan?

Bagaimanakah Saya Boleh Menghentikan Pelaksanaan Goroutine dengan Betul Selepas Tamat Masa dalam Perjalanan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-11 21:30:12976semak imbas

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

Menghentikan Pelaksanaan Goroutine dengan Tamat Masa dalam Pergi

Apabila cuba menamatkan pelaksanaan goroutine apabila tamat masa, ia mungkin kelihatan tidak berkesan. Ini kerana model konkurensi Go beroperasi pada prinsip cantuman garpu, di mana memulakan goroutine (garpu) tidak memberikan kawalan segera ke atas pelaksanaannya. Kawalan hanya diperoleh semula pada titik penyegerakan, seperti komunikasi saluran.

Dalam contoh yang diberikan:

go func() {
    time.Sleep(10 * time.Second)
    fmt.Println("test")
    fmt.Println("test1")
    ch <- Response{data: "data", status: true}
}()

Groutine meneruskan pelaksanaan walaupun tamat masa ditetapkan dalam:

case <-time.After(50 * time.Millisecond):
    return "Timed out", false

Ini kerana tamat masa adalah berkaitan dengan penerima (pembaca) saluran, bukan pengirim. Memandangkan saluran ditimbal, pengirim boleh terus melaksanakan tanpa gangguan.

Untuk mencapai gelagat yang diingini, teknik penyegerakan mesti digunakan. Sebagai contoh, saluran boleh ditutup apabila tamat masa untuk menghalang komunikasi selanjutnya:

select {
case <-ch:
    fmt.Println("Read from ch")
    res := <-ch
    return res.data, res.status
case <-time.After(50 * time.Millisecond):
    close(ch)
    return "Timed out", false
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghentikan Pelaksanaan Goroutine dengan Betul Selepas Tamat Masa dalam Perjalanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn