Editor PHP Youzi akan memperkenalkan kaedah menulis chan secara sync.WaitGroup goroutine. Dalam pengaturcaraan serentak, sync.WaitGroup ialah mekanisme penyegerakan yang sangat berguna yang boleh menunggu pelaksanaan sekumpulan goroutin selesai. Walau bagaimanapun, kadangkala kita perlu menulis keputusan kepada chan selepas goroutine menyelesaikan pelaksanaan untuk penggunaan oleh goroutine lain. Artikel ini akan memperkenalkan secara terperinci cara melaksanakan fungsi ini secara segerak. WaitGroup goroutine, mari lihat!
Saya mendapat senarai item daripada titik akhir API. Kemudian, untuk setiap projek, saya membuat permintaan API lain untuk mendapatkan data tentang projek individu.
Saya tidak boleh membuat permintaan API kedua untuk setiap projek pada masa yang sama kerana token API saya adalah terhad dan jika saya membuat terlalu banyak permintaan pada masa yang sama, saya akan terbantut.
Walau bagaimanapun, data tindak balas API awal boleh dibahagikan kepada beberapa halaman, yang membolehkan saya memproses halaman data secara serentak.
Selepas beberapa penyelidikan, kod di bawah melakukan apa yang saya mahukan:
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } go func() { wg.Wait() close(results) }() for result := range results { fmt.Println(result) } }
Saya ingin memahami mengapa ia berfungsi:
go func() { wg.Wait() close(results) }()
Percubaan pertama saya tidak berjaya - saya fikir saya boleh membaca hasilnya apabila wg.Wait()
之后遍历通道,并且我会在结果写入 results
saluran.
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } // does not work wg.Wait() close(results) for result := range results { fmt.Println(result) } }
Pada percubaan pertama anda:
Pada percubaan kedua:
Atas ialah kandungan terperinci Tulis chan secara serentak.WaitGroup goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!