Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kami Boleh Menutup Saluran dengan Selamat Selepas Semua Goroutine Selesai Menggunakan 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!