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) } }
解決方法
在您的第一次嘗試:
- 主 goroutine 使 3 個 goroutine 將值放入結果通道中。
- 主協程等待所有協程完成。
- 其中一個 goroutine 將一個值放入結果通道中並填滿通道(通道大小為 1 個字串)。
- 現在所有三個 goroutine 都無法再將值放入結果通道並進入睡眠狀態,直到結果通道被釋放。
- 所有 goroutine 都處於睡眠狀態。你陷入了僵局。
在第二次嘗試:
- 主 goroutine 包含 4 個 goroutine。
- 3 個 goroutine 將值放入結果通道中。
- 其他 goroutine(我稱之為第 4 個)等待這 3 個 goroutine 結束。
- 同時主協程等待結果通道中的值(for 迴圈)
- 在這種情況下,如果其中一個 goroutine 在結果通道中放入一個值,則會阻塞其餘的三個 goroutine;主 Goroutine 將值從結果通道中取出,從而解除對其他 Goroutine 的阻塞。
- 因此,所有 3 個 goroutine 都放入各自的值並結束
- 然後第四個 goroutine 關閉通道
- 主 Goroutine 結束其 for 迴圈。
以上是在sync.WaitGroup goroutine中寫入chan的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了GO中的數組和切片之間的差異,重點是尺寸,內存分配,功能傳遞和用法方案。陣列是固定尺寸的,分配的堆棧,而切片是動態的,通常是堆積的,並且更靈活。

本文說明瞭如何在GO中創建和初始化數組,討論數組和切片之間的差異,並解決了數組的最大尺寸限制。數組與切片:固定與動態,值與參考類型。

文章討論了GO中結構的語法和初始化,包括字段命名規則和結構嵌入。主要問題:如何有效地在GO編程中使用結構。 (字符:159)

本文討論了在軟件開發中使用GO(Golang)的好處,重點介紹其並發支持,快速彙編,簡單性和可擴展性優勢。受益的主要行業包括技術,金融和遊戲。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。