Jadual Kandungan
Membunuh Goroutine dalam Go
Penyelesaian: Menggunakan Saluran dan pilih
Corak Konkurensi Lain
Menggunakan Pemasa
Rumah pembangunan bahagian belakang Golang Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?

Bagaimanakah anda menamatkan Goroutine dalam Go dengan berkesan?

Oct 30, 2024 pm 01:15 PM

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

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 &lt;-quit:
            return
        default:
            // Do stuff
        }
    }
}</code>
Salin selepas log masuk

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 &lt;-quit:
            return
        case &lt;-ticker.C:
            // Do stuff
        }
    }
}</code>
Salin selepas log masuk

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Mar 10, 2025 pm 05:38 PM

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya?

See all articles