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
Lepaskan: 2024-12-11 21:30:12
asal
990 orang telah melayarinya

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}
}()
Salin selepas log masuk

Groutine meneruskan pelaksanaan walaupun tamat masa ditetapkan dalam:

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

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan