Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?
Apabila bekerja dengan rutin Go, mengetahui cara menamatkannya dengan berkesan menjadi penting. Pertimbangkan persediaan berikut:
<code class="go">func startsMain() { go main() } func stopMain() { // TODO: Kill main } func main() { // Infinite loop }</code>
Persediaan ini mencipta gelung tak terhingga dalam goroutine bernama utama. Untuk menamatkan gelung, kita memerlukan cara untuk mengawal goroutine daripada stopMain.
Satu pendekatan berkesan untuk membunuh goroutine ialah melalui saluran dan pernyataan pilih.
<code class="go">var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop(quit) } func stopLoop() { close(quit) } func loop(quit chan struct{}) { for { select { case <-quit: return default: // Do stuff } } }</code>
Dalam contoh ini, kami menggunakan saluran bersaiz sifar (chan struct{}) bernama berhenti untuk menandakan goroutine berhenti. Fungsi gelung berulang kali menyemak saluran keluar menggunakan pernyataan pilih. Apabila berhenti menerima nilai (menunjukkan permintaan berhenti), gelung keluar.
Go menawarkan corak serentak tambahan untuk mengendalikan goroutin. Lawati Blog Go untuk mendapatkan lebih banyak cerapan tentang corak ini.
Untuk melaksanakan fungsi pada selang masa yang tetap sambil mengelakkan keletihan CPU, anda boleh menggunakan ticker.
<code class="go">import "time" // [...] func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Do stuff } } }</code>
Dalam kes ini, pilih blok sehingga sama ada berhenti menerima nilai atau ticker fire, membenarkan fungsi tersebut dilaksanakan pada selang waktu tertentu.
Atas ialah kandungan terperinci Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!