Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menutup Saluran Go dengan Amanah Selepas Semua Goroutine Selesai?

Bagaimana untuk Menutup Saluran Go dengan Amanah Selepas Semua Goroutine Selesai?

Susan Sarandon
Susan Sarandonasal
2024-12-15 01:16:13362semak imbas

How to Reliably Close a Go Channel After All Goroutines Finish?

Menutup Saluran Selepas Goroutine Selesai

Apabila bekerja dengan goroutin dan saluran dalam Go, selalunya perlu untuk menentukan bila semua goroutine telah selesai melaksanakan dan menutup saluran dengan sewajarnya. Dua pendekatan biasa dibentangkan dalam soalan: menutup saluran secara eksplisit selepas bertelur goroutine dan menggunakan pengiraan benang.

Penutupan Saluran Eksplisit

Pendekatan pertama melibatkan penutupan saluran selepas semua goroutine dicipta. Walau bagaimanapun, ada kemungkinan saluran itu ditutup lebih awal, menghalang goroutine daripada menghantar keputusannya.

Pengiraan Benang

Dalam pendekatan kedua, kiraan benang dikekalkan, dan saluran ditutup apabila kiraan mencapai sifar. Walaupun berfungsi, ia bergantung pada panggilan tidur atau menunggu sibuk, yang boleh menjadi tidak cekap.

Penyelesaian Sync.WaitGroup

Cara yang lebih cekap dan boleh dipercayai untuk menyelesaikan tugas ini ialah untuk menggunakan jenis penyegerakan.WaitGroup. WaitGroup membenarkan menunggu pada bilangan tugasan tertentu, tanpa mengira susunan penyelesaiannya. Mengubah suai contoh asal untuk menggunakan WaitGroup akan kelihatan seperti ini:

import (
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i <= 10; i++ {
        wg.Add(1)
        go func() {
            result := calculate()
            c <- result
            wg.Done()
        }()
    }

    // Close the channel when all goroutines are finished
    go func() {
        wg.Wait()
        close(c)
    }()

    for result := range c {
        all_result = append(all_result, result...)
    }
}

Pendekatan ini membolehkan goroutine menyelesaikan tugas mereka sebelum menutup saluran, memastikan semua mesej yang dijangka diterima.

Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Go dengan Amanah Selepas Semua Goroutine Selesai?. 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