我正在使用go频道作为类似队列的机制,这非常适合我。我正在为每个用户打开其中一个类似队列的通道,并为每个通道提供一个范围循环。唯一的问题是我没有关闭任何这些渠道。
我想知道Go中是否习惯于在计时器上运行一个基本上破坏非活动通道的go-routine,几乎就像一个“智能”垃圾收集器。
任何反馈都将不胜感激。
感谢。
答案 0 :(得分:3)
通常的做法是在超时时提供通道读写操作。这是一种安全措施,可确保在给定的时间间隔过后,goroutine停止阻塞。
用于此的用例是启动N个例程以在各种http客户端上执行异步搜索。你会想要尽可能多地等待结果,但你不想永远等待。这些http获取程序将执行查询并将结果发送给您,前提是他们可以在设置的超时时间内完成任务。
这是该原则的简单版本。您可以在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
}