Golang频道维护

时间:2014-02-24 01:07:39

标签: go

我正在使用go频道作为类似队列的机制,这非常适合我。我正在为每个用户打开其中一个类似队列的通道,并为每个通道提供一个范围循环。唯一的问题是我没有关闭任何这些渠道。

我想知道Go中是否习惯于在计时器上运行一个基本上破坏非活动通道的go-routine,几乎就像一个“智能”垃圾收集器。

任何反馈都将不胜感激。

感谢。

1 个答案:

答案 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
}