我使用go通道作为类似队列的机制,这非常适合我。我为每个用户打开了一个类似队列的通道,并为每个通道设置了一个for-range循环。唯一的问题是我不会关闭任何这些频道。
我在想,Go中的惯例是否是在一个基本上破坏非活动通道的计时器上运行一个运行例程,几乎就像一个“智能”垃圾收集器。
如有任何反馈,将不胜感激。
谢谢。
发布于 2014-02-24 01:38:57
提供通道读写超时是一种常见的做法。这是一种保障措施,确保在给定的时间间隔过去时,大猩猩停止阻塞。
这方面的一个用例是激发N个例程在各种http客户端上执行异步搜索。你会希望尽可能多地等待结果,但你不想永远等待下去。这些http获取器将执行它们的查询并将结果发送回您,前提是它们可以在设置的超时内完成任务。
以下是这一原则的一个简单版本。您可以在去操场上运行它。这里唯一的区别是,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
}https://stackoverflow.com/questions/21977110
复制相似问题