Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menutup Saluran Panjang Tidak Diketahui dengan Selamat dalam Go?

Bagaimana untuk Menutup Saluran Panjang Tidak Diketahui dengan Selamat dalam Go?

Patricia Arquette
Lepaskan: 2024-12-23 17:44:14
asal
432 orang telah melayarinya

How to Safely Close a Channel of Unknown Length in Go?

Menutup Saluran Tidak Diketahui Panjang

Dalam kod yang disediakan, ralat "hantar pada saluran tertutup" berlaku kerana berbilang goroutine cuba menghantar nilai pada saluran yang telah ditutup. Isu ini timbul daripada kekurangan penyegerakan antara goroutine, kerana satu goroutine menutup saluran sementara yang lain masih menghantar data.

Untuk menutup saluran dengan berkesan dalam situasi ini, adalah penting untuk menentukan bila semua goroutine penghantar telah menyelesaikan tugasan mereka. Ini boleh dicapai menggunakan penyegerakan.WaitGroup untuk mengesan apabila semua gorout penghantar selesai menghantar nilai.

Berikut ialah kod diubah suai yang menggunakan penyegerakan.WaitGroup:

func gen(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    var i int
    for {
        time.Sleep(time.Millisecond * 10)
        ch <- i
        i++
        // when no more data (e.g. from db, or event stream)
        if i > 100 {
            break
        }
    }
}

func receiver(ch chan int) {
    for i := range ch {
        fmt.Println("received:", i)
    }
}

func main() {
    ch := make(chan int)
    wg := &sync.WaitGroup{}

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go gen(ch, wg)
    }

    go func() {
        wg.Wait()
        close(ch)
    }()

    receiver(ch)
}
Salin selepas log masuk

Dalam penyelesaian ini, setiap goroutine penghantar menambah satu pada penyegerakan.WaitGroup untuk menunjukkan bahawa ia akan menghantar nilai pada saluran. The wg.Wait() in the close() goroutine memastikan saluran ditutup hanya selepas semua goroutine penghantar telah menyelesaikan tugas mereka, menghalang ralat "hantar pada saluran tertutup".

Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Panjang Tidak Diketahui dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan