無緩衝通道阻塞接收器,直到通道上有數據可用。我不清楚這種阻塞在同一個信道上有多個接收器(比如說使用goroutines時)的行爲。我相信,只要沒有在該頻道上發送數據,它們就會全部阻止。
但是,一旦我向該頻道發送單個值會發生什麼?哪個接收器/ goroutine會得到數據並因此解除阻塞?他們全部?第一個在線?隨機?單通道上有多個接收器。誰獲取數據?
6
A
回答
12
一個隨機(非確定性)的人會收到它。
4
默認情況下,goroutine通信是synchronous
和unbuffered
:直到有一個接收器接受該值,發送纔會完成。必須有一個接收器準備好接收來自該頻道的數據,然後發送者可以直接將其傳送給接收器。
/接收操作,以便信道發送被阻塞,直到另一側已準備就緒:
1.上的信道塊A發送操作直至一個接收機是可用的相同的信道:如果沒有接收者的值在ch
上,沒有其他值可以放在通道中。反過來說:ch
當頻道不是空的時候不能發送新的值!所以發送操作將等到ch
變爲可用。
2.一個信道的接收操作阻塞,直到一個發送器可用於相同的信道:如果信道中沒有值,則接收器阻塞。
這在下面的示例中被示出:
package main
import "fmt"
func main() {
ch1 := make(chan int)
go pump(ch1) // pump hangs
fmt.Println(<-ch1) // prints only 0
}
func pump(ch chan int) {
for i:= 0; ; i++ {
ch <- i
}
}
因爲沒有接收器的夠程掛起並打印所述第一數量。
要解決這個問題,我們需要定義一個新的goroutine,它從無限循環中的通道讀取數據。
func receive(ch chan int) {
for {
fmt.Println(<- ch)
}
}
然後在main()
:
func main() {
ch := make(chan int)
go pump(ch)
receive(ch)
}
相關問題
- 1. 接收器沒有獲取數據
- 2. Azure數據工廠管道的多個接收器
- 3. AJAX接收多個數據
- 4. AJAX PHP - 接收穫取多個可變數據
- 5. 具有多個接口(Linux)的服務器上接收多播
- 6. 多個單一收集數據庫或具有多個收集的數據庫?
- 7. 從多個服務器上的sql數據庫獲取數據
- 8. 帶有多個UDP接收器的GStreamer管道(包含圖像)
- 9. 有誰知道如何有一個分數通過標籤
- 10. 從多個鏈接中獲取數據
- 11. 有誰知道如何用核心數據填充選取器控制器
- 12. 從多個表單獲取數據Laravel
- 13. 通過多個接口發送/接收數據
- 14. WebSphere MQ接收器通道暫停
- 15. 有誰知道RDP與AWS連接的數據傳輸類型?
- 16. 收集視圖單元獲取數據
- 17. 在單個行上獲取數據
- 18. 基於單個id獲取多個表中的所有數據
- 19. 通知有關數據接收
- 20. IE沒有通過jQuery.post接收數據
- 21. 有誰知道從VB6讀取Access數據庫的入門書
- 22. 獲取推送通知接收數據 - ionic3
- 23. 從USB-GPS接收器讀取數據
- 24. 爲什麼java多播接收器無法在Windows XP上接收數據包?
- 25. 如何通過管道讀取器獲取管道數據字符串
- 26. 在單個系統調用中接收多個數據報
- 27. 獲取會話數據在軌道上
- 28. ReactJS獲取道具上的新數據
- 29. 在Sinatra服務器上接收數據
- 30. goroutine,需要一個通道接收器,並將字符串發送到通道
競爭條件?是否安全? –
是的,這只是goroutine獲得元素的靈活性。 – inf
我不會稱之爲「競賽條件」。該術語通常被定義爲表示由於不安全的併發訪問變量而導致的意外行爲。通道被設計爲可以同時安全地訪問,並且在無緩衝通道上的多個閱讀器沒有任何問題。 – JimB