我有一個由通道連接的 goroutine 的管道,這樣每個 goroutine 將觸發另一個 goroutine,直到所有 goroutine 都運行完畢。把更簡單,假設有兩個夠程A和B,這樣,當A完成它應該告訴B它可以運行。它運行良好,我嘗試了一些變體,因為我對Go 中的管道有了更多的了解。目前我有一個信令通道ch := make(chan struct{})go A(ch)go B(ch)...這B在塊func B(ch <-chan struct{}) { <-ch ...并A在完成后關閉func A(ch chan struct{}) { defer close(ch) ...}這工作正常,我也嘗試過,而不是關閉,struct{}在A().關閉通道或發送空結構之間有什么區別嗎?哪種方式更便宜/更快/更好?自然地,在通道中發送任何其他類型會占用“一些”內存,但是空結構體如何?關閉只是通道的一部分,因此即使信息在 goroutines 之間傳遞,也不會“發送”。我很清楚過早的優化。這只是為了理解事物,而不是優化任何事物。也許有一種慣用的 Go 方式來做到這一點?感謝您對此的任何澄清!
2 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
關閉通道表示該通道上將不再有發送。這通常是可取的,因為在無意發送或關閉(編程錯誤)的情況下,您會在該點之后出現恐慌。Aclose
還可以向多個接收器發出信號,表示沒有更多消息,您無法通過發送標記值來輕松協調。
自然地,在通道中發送任何其他類型會占用“一些”內存,但是空結構體如何?
不能保證它會在無緩沖通道中占用任何額外的內存(這完全是一個實現細節)。發送阻塞,直到接收可以繼續。
關閉只是通道的一部分,因此即使信息在 goroutines 之間傳遞,也不會“發送”。
這里沒有優化,close
只是可以發送到頻道的另一種類型的消息。
每個結構都有明確的含義,您應該使用適當的含義。
如果您需要向一個接收器發送信號,請發送一個哨兵值,并保持通道打開以發送更多值。
如果這是最終消息,則關閉通道,可能會向多個接收器發出信號,再次發送或關閉將是錯誤的。

米脂
TA貢獻1836條經驗 獲得超3個贊
您可以通過多個 goroutine 從封閉通道接收數據,它們永遠不會阻塞。這是一個主要優勢。這是one_to_many 模式。
finish := make(chan struct{})
當許多并發運行者想要報告已完成的事情時,可以在many_to_one模式中使用,而局外人則不會panic
。
這與內存消耗無關。
- 2 回答
- 0 關注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消