Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menutup Saluran Go yang Tidak Diketahui Panjangnya dengan Anggun?

Bagaimana untuk Menutup Saluran Go yang Tidak Diketahui Panjangnya dengan Anggun?

Linda Hamilton
Lepaskan: 2024-12-24 11:20:16
asal
565 orang telah melayarinya

How to Gracefully Close a Go Channel of Unknown Length?

Menentukan Masa Menutup Saluran Tanpa Mengetahui Panjangnya

Apabila bekerja dengan saluran dalam Go, adalah penting untuk menentukan masa yang sesuai untuk menutupnya. Ini memberikan cabaran apabila panjang saluran tidak diketahui.

Pertimbangkan senario berikut:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    go func() {
        for i := 0; i < 100; i++ {
            ch <- i
        }
        close(ch)
    }()

    for v := range ch {
        fmt.Println(v)
    }
}
Salin selepas log masuk

Dalam contoh ini, goroutine menghantar 100 nilai ke saluran, dengan niat untuk menutupnya apabila semua nilai telah dihantar. Walau bagaimanapun, pendekatan ini menimbulkan kebimbangan. Khususnya:

  • Penutupan Serentak: Berbilang gorout mungkin cuba menutup saluran secara serentak, yang membawa kepada panik.
  • Penutupan Tidak Dijangka: Goroutin utama mungkin ditamatkan sebelum semua nilai diterima, menyebabkan beberapa nilai menjadi digugurkan.

Menggunakan WaitGroup untuk Penutupan Anggun

Untuk menangani isu ini, penyegerakan.WaitGroup boleh digunakan untuk menyegerakkan penutupan saluran dengan penyiapan goroutine penghantaran.

package main

import (
    "fmt"
    "sync"
    "time"
)

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

    wg.Add(1) // Increment counter for sender goroutine
    go func() {
        defer wg.Done() // Decrement counter when goroutine completes
        for i := 0; i < 100; i++ {
            ch <- i
        }
        close(ch)
    }()

    go func() {
        wg.Wait() // Wait until the sender goroutine completes
        close(ch) // Close the channel after all values have been sent
    }()

    for v := range ch {
        fmt.Println(v)
    }
}
Salin selepas log masuk

Pelaksanaan Butiran

  • WaitGroup: Penyegerakan.WaitGroup membolehkan kami menjejaki bilangan gorouti yang sedang berjalan. Ia memastikan bahawa goroutine utama tidak ditamatkan sehingga semua goroutine penghantar telah selesai.
  • Groutine Penutupan Berasingan: Penutupan saluran dilakukan dalam goroutine khusus. Ini menjamin bahawa goroutine utama akan keluar hanya selepas semua data yang menunggu dalam saluran telah dibaca.
  • Berbilang Penghantar: Pendekatan ini juga berfungsi untuk senario dengan berbilang goroutin yang dihantar ke saluran yang sama . Penyegerakan.WaitGroup memastikan saluran ditutup hanya selepas semua gorout penghantar selesai menghantar nilai.

Atas ialah kandungan terperinci Bagaimana untuk Menutup Saluran Go yang Tidak Diketahui Panjangnya dengan Anggun?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan