Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?

Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?

DDD
DDDasal
2024-10-30 13:15:03814semak imbas

How do you effectively terminate a Goroutine in Go?

Membunuh Goroutine dalam Go

Apabila bekerja dengan rutin Go, mengetahui cara menamatkannya dengan berkesan menjadi penting. Pertimbangkan persediaan berikut:

<code class="go">func startsMain() {
    go main()
}

func stopMain() {
    // TODO: Kill main
}

func main() {
    // Infinite loop
}</code>

Persediaan ini mencipta gelung tak terhingga dalam goroutine bernama utama. Untuk menamatkan gelung, kita memerlukan cara untuk mengawal goroutine daripada stopMain.

Penyelesaian: Menggunakan Saluran dan pilih

Satu pendekatan berkesan untuk membunuh goroutine ialah melalui saluran dan pernyataan pilih.

<code class="go">var quit chan struct{}

func startLoop() {
    quit := make(chan struct{})
    go loop(quit)
}

func stopLoop() {
    close(quit)
}

func loop(quit chan struct{}) {
    for {
        select {
        case <-quit:
            return
        default:
            // Do stuff
        }
    }
}</code>

Dalam contoh ini, kami menggunakan saluran bersaiz sifar (chan struct{}) bernama berhenti untuk menandakan goroutine berhenti. Fungsi gelung berulang kali menyemak saluran keluar menggunakan pernyataan pilih. Apabila berhenti menerima nilai (menunjukkan permintaan berhenti), gelung keluar.

Corak Konkurensi Lain

Go menawarkan corak serentak tambahan untuk mengendalikan goroutin. Lawati Blog Go untuk mendapatkan lebih banyak cerapan tentang corak ini.

Menggunakan Pemasa

Untuk melaksanakan fungsi pada selang masa yang tetap sambil mengelakkan keletihan CPU, anda boleh menggunakan ticker.

<code class="go">import "time"

// [...]

func loop() {
    ticker := time.NewTicker(2 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-quit:
            return
        case <-ticker.C:
            // Do stuff
        }
    }
}</code>

Dalam kes ini, pilih blok sehingga sama ada berhenti menerima nilai atau ticker fire, membenarkan fungsi tersebut dilaksanakan pada selang waktu tertentu.

Atas ialah kandungan terperinci Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?. 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