Dilema Goroutine Utama: Tidur atau Berhenti?
Pemaju sering menghadapi keperluan untuk memastikan projek Go mereka sentiasa berjalan, menyerupai nyala api abadi yang tidak pernah gagal. Sebaliknya, terdapat keadaan apabila seseorang ingin menamatkan perlaksanaan program dengan anggun. Artikel ini meneroka pilihan yang tersedia untuk senario ini.
"Tidur" Goroutine Utama
Untuk menjadikan goroutine utama tidak aktif, beberapa binaan wujud yang menghalang pelaksanaannya dengan berkesan tanpa menggunakan sumber CPU. Pertimbangkan contoh berikut:
Pilih tanpa Kes:
select{}
Menerima daripada Kosong Saluran:
<-make(chan int)
Menerima daripada Saluran Tiada:
<-(chan int)(nil)
Menghantar kepada Nil Saluran:
(chan int)(nil) <- 0
Mengunci Mutex Terkunci:
mu := sync.Mutex{} mu.Lock() mu.Lock()
Merangsang Pengakhiran: Berhenti dari Goroutine
Jika objektifnya adalah untuk menyediakan cara untuk penamatan, memperkenalkan saluran berhenti adalah pendekatan yang berdaya maju. Dalam goroutine utama, kod boleh menunggu selama-lamanya untuk isyarat daripada saluran ini. Apabila masanya sudah matang, saluran berhenti boleh ditutup:
var quit = make(chan struct{}) func main() { // Startup code... // Block until the quit signal arrives: <-quit } // In a separate goroutine, when termination is requested: close(quit)
Nota: Menutup saluran berhenti boleh mencetuskan penamatan serta-merta program, mengikut spesifikasi pelaksanaan program Go.
Tidur Tidak Menghalang
Dalam kes di mana menyekat goroutine utama tidak diingini, satu alternatif ialah menggunakan masa.Sleep() dengan tempoh yang meluas. Tempoh maksimum yang dibenarkan ialah lebih kurang 292 tahun:
time.Sleep(time.Duration(1<<63 - 1))
Untuk program yang ditakdirkan untuk bertahan lebih lama daripada tempoh ini, gelung tak terhingga boleh dilaksanakan:
for { time.Sleep(time.Duration(1<<63 - 1)) }
Atas ialah kandungan terperinci Patutkah My Go Main Goroutine Tidur Selamanya atau Berhenti Dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!