Menandatangani Goroutine untuk Ditamatkan
Dalam Go, pengendalian penamatan goroutine boleh menjadi penting apabila memastikan penutupan aplikasi yang anggun atau mengurus peruntukan sumber. Artikel ini meneroka teknik untuk memberi isyarat kepada goroutine yang sedang berjalan supaya menghentikan pelaksanaannya.
Contoh yang disediakan dalam pertanyaan menunjukkan goroutine yang gelung tak terhingga, meniru pemprosesan berterusan. Matlamatnya adalah untuk menamatkan goroutine ini jika ia melebihi tamat masa yang ditentukan.
Pendekatan awal melibatkan penggunaan dua saluran: satu untuk komunikasi dan satu lagi untuk penamatan isyarat. Walau bagaimanapun, membaca daripada saluran isyarat akan menyekat goroutine, mengalahkan tujuan yang dimaksudkan.
Menggunakan Saluran Hentian Tambahan
Satu penyelesaian yang berkesan ialah memperkenalkan saluran hentian tambahan , tooLate, jenis chan struct{}. Di dalam goroutine, pernyataan pilih digunakan untuk memantau kedua-dua saluran komunikasi dan saluran berhenti. Jika saluran tooLate menerima nilai, goroutine akan kembali dengan anggun, menamatkan gelung pemprosesannya.
Berikut ialah coretan kod yang diubah suai:
<code class="go">func main() { // tooLate channel to signal goroutine to stop tooLate := make(chan struct{}) proCh := make(chan string) go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": // Avoid blocking default: // Handle potential blocking } fmt.Println("done here") } }() // ... // Signal termination fmt.Println("too late") close(tooLate) // ... }</code>
Dalam penyelesaian ini, saluran proCh terus digunakan untuk komunikasi, manakala saluran tooLate berfungsi sebagai isyarat untuk penamatan. Apabila saluran tooLate ditutup, goroutine mengesan ini dan keluar dari gelungnya.
Pertimbangan Lain
Selain menggunakan saluran tambahan, terdapat pendekatan alternatif untuk memberi isyarat goroutin, seperti menggunakan penyegerakan terbina dalam. Jenis Cond untuk kawalan yang lebih halus ke atas penyegerakan goroutine. Pilihan teknik bergantung pada keperluan khusus permohonan anda.
Atas ialah kandungan terperinci Bagaimana untuk Menamatkan Goroutine Berjalan dengan Anggun dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!