3 回答

TA貢獻1847條經驗 獲得超7個贊
通道上的發送操作會阻塞,直到接收器可用于同一通道:如果通道上的值沒有接收器,則不能將其他值放入通道。反之亦然:當通道不為空時,不能在通道中發送新值!因此發送操作將等待直到通道再次可用。
另一方面,通道的接收操作會阻塞,直到發送方可用于同一通道:如果通道中沒有值,則接收方將阻塞。
要解鎖通道,我們需要無限循環地從通道中提取數據。
這就是程序在無限循環中發送和讀取數據的原因。

TA貢獻1828條經驗 獲得超13個贊
當輪詢函數中的“in”通道(從主函數接收)僅運行 3 個輪詢 go 例程時,程序如何無限執行輪詢函數?
因此,首先該程序創建兩個輪詢器:
for i := 0; i < numPollers; i++ {
go Poller(pending, complete, status)
}
然后它將三個資源發送到掛起:
for _, url := range urls {
pending <- &Resource{url: url}
}
每個輪詢器從待處理中讀取并輪詢資源:
for r := range in {
s := r.Poll()
status <- State{r.url, s}
out <- r
}
這段代碼似乎是無限執行的,但它通常會阻止從隊列中讀取。所以這個循環等待下一個值出現。
讓我們實際上跳過它:
有兩個 Poller 閱讀資源。
程序將第一個資源發送到隊列。
其中一個輪詢器獲取資源并開始池化。另一個等待。
在某個時刻,程序將新資源發送到隊列。
當第一個輪詢器忙時,第二個輪詢器被解除阻塞并開始輪詢。
程序發送第三個資源并在兩個輪詢器忙時阻塞。
當其中一個輪詢器完成時,它會占用最后一個資源并繼續。
同時,主程序從完整隊列中讀取值。
for r := range in { s := r.Poll() status <- State{r.url, s} out <- r }
這段代碼如何無限運行?如果它在“in”通道上循環,并且“in”從掛起隊列中獲取其資源,則它應該在幾次迭代后終止。我想這正是我不明白的部分。
準確地說,in
不從pending
隊列中獲取資源。in
是 pending
隊列。隊列(或通道,我可以互換使用)可以通過調用close 關閉,但直到它沒有被明確關閉,它才被認為是活動的。對它的任何讀取都會阻塞當前的 goroutine,直到給出下一個值。然后 gorotine 繼續。
我想您一直在考慮通道,就像它們是具有固定數量元素的數組一樣。他們不是??紤]到他們喜歡具有無限數量元素的數組,但具有可能引發異常的阻塞讀?。ㄈ绻皇煜み@個概念,這是關閉隊列的粗略近似值)。
- 3 回答
- 0 關注
- 207 瀏覽
添加回答
舉報