Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `pulih` Tertunda dalam Fungsi Pemanggil Mengendalikan Panik dalam Goroutine Kanak-kanak?
Bagaimana Fungsi Pemanggil Menangani Panik dalam Goroutine Kanak-kanak
Sebelum ini dipercayai bahawa panik dalam goroutine akan menamatkan program jika fungsi pemanggilnya selesai sebelum panik berlaku. Walau bagaimanapun, contoh kod terbaru mencadangkan sebaliknya:
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
Anehnya, program ini ditamatkan tidak kira sama ada fungsi pemanggil (fun1) selesai sebelum atau selepas panik dalam goroutine kanak-kanak (fun2). Ini menimbulkan persoalan: mengapa mekanisme pemulihan tertunda dalam fungsi pemanggil tidak menghalang program daripada ranap?
Penjelasan Spesifikasi
Mengikut spesifikasi Go:
"Semasa melaksanakan fungsi F, panggilan eksplisit untuk panik atau panik masa jalan menamatkan pelaksanaan F. Sebarang fungsi yang ditangguhkan oleh F kemudiannya dilaksanakan seperti biasa. Seterusnya, sebarang fungsi tertunda yang dijalankan oleh pemanggil F dijalankan , dan seterusnya sehingga mana-mana tertunda oleh fungsi peringkat atas dalam goroutine pelaksana Pada ketika itu, program ditamatkan dan keadaan ralat dilaporkan, termasuk nilai hujah untuk panik. "
Aplikasi kepada Kod
Menggunakan spesifikasi ini pada kod kami, kami mendapati bahawa:
Kesimpulan
Oleh itu, adalah penting untuk memahami bahawa goroutine tidak boleh pulih daripada panik dalam goroutine lain. Jika kanak-kanak goroutine panik, hanya goroutine itu sendiri boleh mengendalikan panik menggunakan mekanisme penangguhan/pemulihan. Jika goroutine kanak-kanak tidak pulih, keseluruhan program akan ditamatkan, tanpa mengira status pemanggilnya.
Atas ialah kandungan terperinci Mengapakah `pulih` Tertunda dalam Fungsi Pemanggil Mengendalikan Panik dalam Goroutine Kanak-kanak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!