Rumah > pembangunan bahagian belakang > Golang > Bolehkah Fungsi Pemanggil Pulih daripada Panik dalam Goroutine Kanak-kanak dalam Go?

Bolehkah Fungsi Pemanggil Pulih daripada Panik dalam Goroutine Kanak-kanak dalam Go?

Barbara Streisand
Lepaskan: 2024-10-29 08:41:30
asal
467 orang telah melayarinya

Can a Caller Function Recover from Panics in Child Goroutines in Go?

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan