我有一個通道連接的通道,所以每個goroutine都會觸發另一個直到所有的通道都運行。放得更簡單,想象兩個門店A
和B
,以便當A
完成後,它應該告訴B
它可以運行。關閉頻道與發送例如一個空的結構?
這工作正常,我已經嘗試了幾個變種,因爲我已經瞭解了更多關於pipelines in Go。
目前,我有一個信令信道
ch := make(chan struct{})
go A(ch)
go B(ch)
...
上
func B(ch <-chan struct{}) {
<-ch
...
和A
B
塊做
func A(ch chan struct{}) {
defer close(ch)
...
}
能正常工作的時候,我也試過關閉,而不是關閉,發送一個空的結構struct{}
i n A()
。
關閉通道或發送空結構有什麼區別嗎?無論哪種方式更便宜/更快/更好?
當然,在通道中發送任何其他類型會佔用「一些」內存量,但它如何與空的結構?關閉只是通道的一部分,因此即使信息在goroutine之間傳遞,也不會「發送」。
我很清楚過早的優化。這只是爲了理解事情,而不是優化任何事情。
也許有一種慣用的Go方式來做到這一點?
感謝您對此的任何澄清!
感謝您的回答。我知道什麼關閉意味着什麼,並且詢問'close(ch)'和'ch < - struct {} {}'。你有沒有提到close是一個信息,而不是頻道的屬性? – murrekatt 2015-03-30 18:15:03
@murrekatt:'close'是一個合乎邏輯的消息,該承諾沒有更多的價值將被送到你認爲什麼是消息的特殊值?發送和關閉都只是操縱通道的內部狀態,導致將值發送到接收器。 – JimB 2015-03-30 18:32:17
我在Go的源代碼中查看了什麼'close',並且它設置了一個標誌,指示通道已關閉。 – murrekatt 2015-03-31 07:45:09