簡體   English   中英

分塊讀取 Go 個頻道

[英]Reading Go channels in chunks

我是 Go 的新手,我正在嘗試編寫一個具有兩種類型的 goroutine 的程序,一些會寫入通道,一些會從該通道讀取。

我想設置它,以便從通道讀取的 goroutines 將以兩個塊為單位讀取,而 writer goroutines 將一個接一個地寫入。 像這樣:

n := 20
ch := make(chan struct{}, 2)

// writer goroutines
for i := 0; i < n*2; i++ {
    go func() {
        ch <- struct{}{}
    }()
}

// reader goroutines
for i := 0; i < n; i++ {
    go func() {
        <- ch
        <- ch
    }()
}

我希望我的 writer goroutines 不斷向我的頻道添加元素,直到它已滿,之后我希望我的一個 reader goroutines 處理頻道中的兩個元素並一次清除所有元素。 基本上,reader goroutines 必須等待通道滿了才能清除它。

不用說,我上面的實現會有競爭條件,並且不是 go 的最佳方式。 我該如何解決這個問題? 我不確定如何讓我的閱讀器 goroutines 一次讀取多個內容並同時避免競爭問題。 我願意使用 Go 的其他功能而不是頻道。

len(ch) - 將返回通道緩沖區中排隊(未讀)的元素數。 您可以使用這個 function 來確保頻道在消費前已滿。

另一方面,你必須讓你的主例程等到 reader 和 writer goroutines 都完成。 你可以使用sync.WaitGroup來做到這一點

參考: sync.WaitGroup 例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM