我使用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文件描述符或类似的东西。我不知道这是你问的,但我想我会指出。 –