php小編柚子在這裡為大家介紹在sync.WaitGroup goroutine中寫入chan的方法。在並發程式設計中,sync.WaitGroup是一種非常有用的同步機制,它可以等待一組goroutine的執行完成。然而,有時我們需要在goroutine執行完畢後,將結果寫入到一個chan中,以供其他goroutine消費。本文將詳細介紹如何在sync.WaitGroup goroutine中實現這項功能,讓我們一起來看看吧!
我正在從 API 端點取得項目清單。然後,對於每個項目,我都會發出另一個 API 請求以獲取有關單一項目的資料。
我無法同時對每個專案發出第二個 API 請求,因為我的 API 令牌有速率限制,如果我同時發出太多請求,我會受到限制。
但是,初始 API 回應資料可以分為多個頁面,這使我能夠同時處理資料頁面。
經過一些研究,下面的程式碼完全符合我的要求:
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) } }
我想了解為什麼它能發揮作用:
go func() { wg.Wait() close(results) }()
我的第一次嘗試沒有成功——我想我可以在wg.Wait()
之後遍歷通道,並且我會在結果寫入results
通道時讀取結果。
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) } }
在您的第一次嘗試:
在第二次嘗試:
以上是在sync.WaitGroup goroutine中寫入chan的詳細內容。更多資訊請關注PHP中文網其他相關文章!