Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Memastikan Semua Goroutine Selesai Apabila Menggunakan Saluran Penampan sebagai Semaphore?

Bagaimanakah Saya Boleh Memastikan Semua Goroutine Selesai Apabila Menggunakan Saluran Penampan sebagai Semaphore?

Susan Sarandon
Lepaskan: 2024-12-02 00:54:13
asal
628 orang telah melayarinya

How Can I Ensure All Goroutines Finish When Using a Buffered Channel as a Semaphore?

Menunggu Kekosongan Saluran Penimbal Menggunakan WaitGroup

Dalam pengaturcaraan serentak, selalunya perlu mengawal bilangan goroutin yang dilaksanakan secara serentak. Pendekatan biasa ialah menggunakan saluran buffered sebagai semaphore. Walau bagaimanapun, adalah penting untuk mengambil perhatian batasan pendekatan ini.

Pertimbangkan contoh berikut:

ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
 sem := make(chan struct{}, 2)
for _, i := range ints {
  sem<- struct{}{}
  go func(id int, sem chan struct{}) {
    // do something
    <-sem
  }(i, sem)
}
Salin selepas log masuk

Kod ini menggunakan saluran penimbal (sem) saiz 2 untuk mengehadkan bilangan serentak goroutine hingga 2. Walau bagaimanapun, terdapat masalah: program mungkin tamat sebelum beberapa goroutin terakhir menyelesaikan tugas mereka. Ini kerana saluran penimbal boleh menjadi kosong pada bila-bila masa semasa pemprosesan, walaupun semasa program menghantar lebih banyak goroutine.

Untuk menunggu saluran penimbal mengalir, kita tidak boleh bergantung pada saluran itu sendiri. Sebaliknya, kami boleh menggunakan penyegerakan.WaitGroup untuk menjejaki bilangan goroutin yang belum selesai:

sem := make(chan struct{}, 2)
var wg sync.WaitGroup
for _, i := range ints {
  wg.Add(1)
  sem<- struct{}{}
  go func(id int) {
    defer wg.Done()
    // do something
    <-sem
  }(i)
}
wg.Wait()
Salin selepas log masuk

Dalam kod yang diubah suai ini, kami menggunakan wg.Add(1) untuk menambah kumpulan tunggu sebelum menghantar setiap goroutine. Pernyataan tangguh wg.Done() kemudian mengurangkan kumpulan tunggu apabila goroutine menyelesaikan tugasnya. Akhir sekali, wg.Wait() menyekat sehingga kumpulan tunggu mencapai sifar, memastikan semua goroutine telah selesai dilaksanakan. Pendekatan ini membolehkan kami menunggu sehingga saluran mengalir dan memastikan program tidak ditamatkan sebelum waktunya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Semua Goroutine Selesai 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