Menghentikan Pelaksanaan Goroutine pada Tamat Masa
Dalam Go, goroutine menyediakan cara yang ringan untuk melaksanakan kod serentak. Walau bagaimanapun, kadangkala anda perlu menghentikan goroutine selepas tempoh masa tertentu.
Masalah:
Seorang pengguna menghadapi isu di mana goroutine terus melaksanakan walaupun selepas tamat masa telah ditetapkan. Mereka menjangkakan goroutine akan berhenti serta-merta apabila mencapai tamat masa, tetapi sebaliknya, ia mencetak mesej tambahan. Berikut ialah kod contoh:
type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }() select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): return "Timed out", false } }
Output Jangkaan:
Output Sebenar:
Analisis:
Masalah timbul kerana tamat masa ditetapkan pada bahagian penerima daripada saluran ch, bukan pada hujung penghantaran. Walaupun tamat masa dengan betul mengenal pasti bahawa tiada data diterima dalam masa 50 milisaat, ia tidak menghalang goroutine daripada melaksanakan selanjutnya dan menghantar data pada saluran selepas itu.
Penyelesaian:
Memandangkan tidak mungkin untuk mengganggu secara langsung pelaksanaan goroutine dalam Go, pendekatan alternatif adalah diperlukan:
Atas ialah kandungan terperinci Bagaimana untuk Menghentikan Pelaksanaan Go Goroutine Selepas Tamat Masa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!