首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang通道维护

Golang通道维护
EN

Stack Overflow用户
提问于 2014-02-24 01:07:39
回答 1查看 256关注 0票数 3

我使用go通道作为类似队列的机制,这非常适合我。我为每个用户打开了一个类似队列的通道,并为每个通道设置了一个for-range循环。唯一的问题是我不会关闭任何这些频道。

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

如有任何反馈,将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 01:38:57

提供通道读写超时是一种常见的做法。这是一种保障措施,确保在给定的时间间隔过去时,大猩猩停止阻塞。

这方面的一个用例是激发N个例程在各种http客户端上执行异步搜索。你会希望尽可能多地等待结果,但你不想永远等待下去。这些http获取器将执行它们的查询并将结果发送回您,前提是它们可以在设置的超时内完成任务。

以下是这一原则的一个简单版本。您可以在去操场上运行它。这里唯一的区别是,goroutine是从我们的队列通道读取的,而不是发送数据的那个。但原则是一样的。

代码语言:javascript
复制
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
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21977110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档