Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `pulih` Tertunda dalam Fungsi Pemanggil Mengendalikan Panik dalam Goroutine Kanak-kanak?

Mengapakah `pulih` Tertunda dalam Fungsi Pemanggil Mengendalikan Panik dalam Goroutine Kanak-kanak?

Susan Sarandon
Susan Sarandonasal
2024-11-03 18:06:03563semak imbas

Why Doesn't a Deferred `recover` in a Caller Function Handle Panics in Child Goroutines?

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:

  • Apabila fun2 panik, ia menjadi goroutine peringkat atas dan ditamatkan.
  • Memandangkan fun2 tidak pulih daripada panik, program ditamatkan.
  • Panggilan tertunda dalam fun1 tidak digunakan kerana panik berlaku dalam goroutine yang berbeza.

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!

Kenyataan:
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