Go menawarkan pelbagai mekanisme untuk memastikan goroutine utama berjalan selama-lamanya tanpa menggunakan kuasa pemprosesan . Pertimbangkan strategi ini:
Pilih tanpa Kes: Menyekat selama-lamanya tanpa penggunaan CPU boleh dicapai melalui penyataan terpilih tanpa kes atau klausa lalai:
select {}
Menerima daripada Saluran Kosong: goroutine utama boleh digantung selama-lamanya dengan terus menerima daripada saluran kosong:
<-make(chan int)
Menerima daripada Saluran Tiada: Begitu juga, menerima daripada saluran tiada menghasilkan sama kesan:
<-chan int(nil)
Menghantar ke Saluran Nil: Menghantar ke saluran nil juga menggantung goroutine utama secara kekal:
(chan int)(nil) <- 0
Mengunci Mutex Pra-Kunci: Mengunci yang sudah mutex berkunci dengan berkesan menghalang goroutine utama:
mu := sync.Mutex{} mu.Lock() mu.Lock()
Untuk memudahkan keluar yang anggun, saluran berhenti khusus boleh digunakan. Apabila timbul keperluan untuk menamatkan program, saluran ini ditutup:
var quit = make(chan struct{}) func main() { defer close(quit) // Application code... <-quit }
Dalam goroutine yang berasingan, menutup saluran berhenti mencetuskan jalan keluar goroutine utama:
close(quit)
Jika matlamatnya adalah untuk memastikan goroutine utama daripada ditamatkan tanpa menyekatnya, time.Fungsi Sleep() boleh digunakan dengan tempoh yang cukup besar, dihadkan pada kira-kira 292 tahun:
time.Sleep(time.Duration(1<<63 - 1))
Untuk tempoh lanjutan, pertimbangkan gelung tidak berkesudahan yang menggabungkan masa di atas.Sleep():
for { time.Sleep(time.Duration(1<<63 - 1)) }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Goroutine Utama Berjalan Tanpa Had dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!