我使用go通道作爲類似隊列的機制,它非常適合我。我爲每個用戶打開了一個類似隊列的頻道,併爲這些頻道中的每一個頻道提供了一個範圍循環。唯一的是我沒有關閉任何這些頻道。Golang Channel維護
我想知道它是否習慣於在基本上破壞非活動通道的定時器上運行go-routine,幾乎就像一個「智能」垃圾回收器。
任何反饋將不勝感激。
謝謝。
我使用go通道作爲類似隊列的機制,它非常適合我。我爲每個用戶打開了一個類似隊列的頻道,併爲這些頻道中的每一個頻道提供了一個範圍循環。唯一的是我沒有關閉任何這些頻道。Golang Channel維護
我想知道它是否習慣於在基本上破壞非活動通道的定時器上運行go-routine,幾乎就像一個「智能」垃圾回收器。
任何反饋將不勝感激。
謝謝。
通常的做法是提供通道讀取和寫入超時。這是一個安全措施,確保一個特定的時間間隔已經過去的時候,goroutine會停止阻塞。
這是一個用例,它激發N個例程在不同的http客戶端上執行異步搜索。你會想盡可能多的等待結果,但你不想永遠等下去。這些http fetchers將執行他們的查詢並將結果發回給你,只要他們能夠在設定的超時時間內完成任務。
下面是該原理的簡單版本。你可以在Go playground上運行它。這裏唯一的區別是,goroutine 正在從我們的隊列頻道讀取,而不是發送給我們的數據。但原則是相同的。
package main
import (
"fmt"
"time"
)
func main() {
queue := make(chan int, 1)
defer close(queue)
// Fire up a consumer.
// Ensure it times out after 3 seconds of waiting for a value.
go func() {
select {
case val := <-queue:
fmt.Printf("Received: %d\n", val)
case <-time.After(3 * time.Second):
fmt.Println("Timeout!")
}
}()
// Do something important for 5 seconds.
<-time.After(5 * time.Second)
// Send value to user.
queue <- 123
}
這不是一個很好的例子。 main()函數實際上可能在您的goroutine進入Print {f,ln}語句之前結束/關閉(因此程序結束)。您通常會想要在goroutine中執行「工作」並等待產卵(主)功能的結果。 – mzimmerman
您不需要關閉Go中的頻道,它們不像unix文件描述符或類似的東西。我不知道這是你問的,但我想我會指出。 –