Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memastikan Semua Goroutine Lengkap Sebelum Program Keluar Apabila Menggunakan Saluran Penampan sebagai Semaphore?

Bagaimana untuk Memastikan Semua Goroutine Lengkap Sebelum Program Keluar Apabila Menggunakan Saluran Penampan sebagai Semaphore?

Linda Hamilton
Lepaskan: 2024-12-30 10:09:11
asal
498 orang telah melayarinya

How to Ensure All Goroutines Complete Before Program Exit When Using a Buffered Channel as a Semaphore?

Menunggu Saluran Penimbalan untuk Disahkan

Dalam kod yang disediakan, saluran penimbal digunakan sebagai semafor untuk mengehadkan bilangan serentak menjalankan goroutines. Walau bagaimanapun, tanpa mekanisme yang jelas untuk menunggu saluran mengalir, program utama mungkin ditamatkan sebelum semua gorout selesai dilaksanakan.

Masalah:

Bagaimana untuk memastikan bahawa program menunggu semua goroutine selesai sebelum ini keluar?

Jawapan:

Menggunakan semaphore (saluran) untuk tujuan ini tidak sesuai kerana tiada cara terbina dalam untuk menyemak panjang saluran dan menunggu ia mencapai 0. Untuk menunggu gorouti dengan betul selesai, pertimbangkan untuk menggunakan primitif penyegerakan seperti sync.WaitGroup.

Kod Kemas Kini:

sem := make(chan struct{}, 2)
var wg sync.WaitGroup

for _, i := range ints {
    wg.Add(1)
    // acquire semaphore
    sem <- struct{}{}
    // start long running go routine
    go func(id int) {
        defer wg.Done()
        // do something
        // release semaphore
        <-sem
    }(i)
}

wg.Wait()
Salin selepas log masuk

Segerakan.WaitGroup mengekalkan kiraan tugas yang belum selesai (goroutine dalam kes ini) . Ini membolehkan program utama menunggu sehingga semua tugasan selesai. wg.Add(1) menambah kiraan tugas sebelum memulakan goroutine baharu dan wg.Done() mengurangkan kiraan apabila goroutine selesai. Panggilan wg.Wait() menyekat program utama sehingga kiraan tugasan mencapai 0, memastikan semua goroutine telah selesai sebelum program keluar.

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Semua Goroutine Lengkap Sebelum Program Keluar Apabila Menggunakan Saluran Penampan sebagai Semaphore?. 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