Pemulihan daripada Child Goroutine Panic in Go
Semasa usaha pengaturcaraan baru-baru ini, andaian asas telah dicabar: keupayaan fungsi pemanggil untuk pulih daripada panik goroutine kanak-kanak. Walaupun kebijaksanaan konvensional mencadangkan sebaliknya, didapati bahawa mekanisme pemulihan tertunda pemanggil gagal menghalang penamatan keseluruhan program apabila goroutine kanak-kanak menjadi mangsa panik.
Untuk menggambarkan tingkah laku yang membingungkan ini, pertimbangkan kod berikut:
<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>
Menariknya, tidak kira sama ada fun1 berakhir sebelum atau selepas panik fun2, mekanisme pemulihan tertunda dalam fun1 terbukti tidak berkesan, yang membawa kepada kematian serta-merta program.
Penalaran di sebalik Kegagalan
Spesifikasi Go memberikan kejelasan tentang tingkah laku tidak konvensional ini:
Semasa melaksanakan fungsi F, panggilan eksplisit untuk panik atau panik masa jalan menamatkan pelaksanaan F. Mana-mana 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, atur cara ditamatkan dan keadaan ralat dilaporkan, termasuk nilai hujah untuk panik.
Dalam kes ini, fun2 mewakili fungsi peringkat atas yang dilaksanakan dalam goroutine masing-masing. Memandangkan fun2 tidak mempunyai mekanisme pemulihan, program ini ditamatkan apabila paniknya, tanpa mengambil kira sebarang percubaan pemulihan tertunda dalam fun1 atau pendahulunya.
Tingkah laku ini menggariskan perbezaan yang penting: goroutin tidak boleh pulih daripada panik yang berasal dari goroutine yang berasingan. Akibatnya, pemulihan yang tertunda dalam fun1 menjadi sia-sia, kerana panik dalam fun2 secara berkesan menamatkan goroutine dan sebarang usaha pemulihan seterusnya.
Atas ialah kandungan terperinci Bolehkah Fungsi Pemanggil Pulih daripada Panik dalam Goroutine Kanak-kanak dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!