Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memastikan Goroutine Saya Berjalan Walaupun Selepas Panik?

Bagaimanakah Saya Boleh Memastikan Goroutine Saya Berjalan Walaupun Selepas Panik?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 00:20:13157semak imbas

How Can I Keep My Go Goroutines Running Even After a Panic?

Menjaga Goroutines Berlari Walaupun Ranap

Dalam Go, goroutin berkuasa tetapi boleh terdedah kepada ranap akibat ralat atau panik. Untuk memastikan kegagalan satu goroutine tidak memberi kesan kepada orang lain, pembangun mungkin tertanya-tanya sama ada terdapat cara untuk memastikan goroutine yang tidak terjejas berjalan.

Untuk pulih daripada panik, fungsi recover() terbina dalam digunakan. Ia membolehkan anda menangkap panik dalam fungsi tertunda. Fungsi pembantu berikut, protect(), menggunakan mekanisme ini untuk melancarkan goroutine dengan pemulihan panik:

func protect(f func()) {
    defer func() {
        if err := recover(); err != nil {
            log.Printf("Recovered: %v", err)
        }
    }()

    f()
}

Untuk menggunakan perlindungan ini, hanya berikan fungsi anda sebagai hujah untuk protect(). Dengan membungkus panggilan ini dalam gelung for yang terus mencetak "tanda", kami boleh menunjukkan cara goroutine yang dilindungi oleh protect() akan terus berjalan walaupun panik berlaku dalam goroutine lain:

func main() {
    go protect(doPanic)

    for {
        time.Sleep(time.Second)
        fmt.Println("tick")
    }
}

Aplikasi ujian ini akan mengeluarkan:

2021/03/04 14:12:31 about to panic
2021/03/04 14:12:31 Recovered: test
tick
tick
tick
...

Seperti yang anda lihat, panik dalam fungsi doPanic dipulihkan dan dikendalikan, manakala yang dilindungi goroutine terus berjalan dan mencetak "tanda." Pendekatan ini berkesan mengasingkan goroutine daripada panik, memastikan satu kegagalan tidak merebak dan merosakkan keseluruhan aplikasi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Goroutine Saya Berjalan Walaupun Selepas Panik?. 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