Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kami Boleh Menutup Saluran dengan Selamat Selepas Semua Goroutine Selesai Menggunakan WaitGroup?

Bagaimanakah Kami Boleh Menutup Saluran dengan Selamat Selepas Semua Goroutine Selesai Menggunakan WaitGroup?

Linda Hamilton
Linda Hamiltonasal
2024-12-22 05:57:13714semak imbas

How Can We Safely Close a Channel After All Goroutines Have Completed Using a WaitGroup?

Tutup Saluran selepas Goroutine Selesai dengan WaitGroup

Apabila bekerja dengan saluran dan goroutin, menutup saluran selepas semua goroutine selesai adalah penting. Ini menghalang komunikasi lanjut pada saluran dan membolehkan pengurusan sumber yang anggun.

Kod yang disediakan cuba melaksanakan gelagat ini, tetapi menghadapi pengehadan disebabkan keadaan perlumbaan. Untuk menangani cabaran ini, kami boleh menggunakan jenis penyegerakan.WaitGroup.

WaitGroup membolehkan kami membuat koleksi tugasan dan menunggu tugasan itu selesai sebelum meneruskan pelaksanaan. Dalam konteks menutup saluran, kami boleh menggunakan WaitGroup untuk memastikan saluran ditutup hanya apabila semua goroutine telah selesai menggunakannya.

Coretan kod yang dipertingkat menggunakan WaitGroup:

import (
    "sync"
)

// ...

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...)
}

Dalam kod yang dikemas kini ini, kami menggunakan WaitGroup untuk menjejaki bilangan goroutin yang belum selesai. Setiap goroutine yang melaksanakan tugas menambah kaunter WaitGroup, menunjukkan bahawa ia telah bermula. Setelah selesai, setiap goroutine mengurangkan kaunter WaitGroup, menunjukkan bahawa ia telah selesai. Sebuah goroutine yang berasingan menunggu di WaitGroup dan menutup saluran setelah semua goroutine melaporkan penyiapannya.

Pendekatan ini memastikan penutupan saluran yang disegerakkan dan boleh dipercayai, menghalang isu yang dihadapi dalam kod asal. Ia juga menghapuskan keperluan untuk panggilan tidur dan sibuk menunggu, menyediakan penyelesaian yang lebih cekap dan mantap.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Menutup Saluran dengan Selamat Selepas Semua Goroutine Selesai Menggunakan WaitGroup?. 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