【问题标题】:Is it OK to leave a channel open?可以让频道保持打开状态吗?
【发布时间】:2012-01-25 11:46:37
【问题描述】:

如果我从不检查 Go 通道的状态,是否可以让 Go 通道永远打开(永远不要关闭通道)?会不会导致内存泄露?下面的代码可以吗?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}

【问题讨论】:

    标签: go channel


    【解决方案1】:

    上面已经很好地介绍了这一点,但是我发现A Tour of Go 中的以下内容非常清楚,这也给出了何时使用close 的示例:

    另一个注意事项:频道不像文件;您通常不需要关闭它们。仅当必须告知接收器没有更多值时才需要关闭,例如终止 range 循环。

    【讨论】:

      【解决方案2】:

      "使用 Go 通道的一个一般原则是不要从接收方关闭通道,如果通道有多个并发发送方,也不要关闭通道。"

      正如上面的答案中明确提到的那样,一旦标记为清理,每个通道最终都会被 GC,因此可以不关闭通道,唯一的区别是该通道将可用于gc几个周期后,如果没有明确关闭。

      以下文章thisthis 还展示了在 1:N、N:1 或 M:N(发送者:接收者)的情况下关闭通道的各种方法

      【讨论】:

        【解决方案3】:

        是的,保持通道打开是可以的。正如the go programming language 书中所说:

        完成后,您无需关闭每个频道。 这是 只有在重要的时候才需要关闭通道 接收所有数据已发送的 goroutine。 垃圾收集器确定不可达将有其 无论是否关闭,资源都会被回收。 (不要混淆这个 与打开文件的关闭操作。重要的是打电话给 关闭方法,当你完成每个文件。)

        【讨论】:

          【解决方案4】:
          推荐的答案 Go Language

          可以让 Go 频道永远打开并且永远不要关闭它。当通道不再使用时,将被垃圾回收。

          请注意,只有在接收器处于关闭状态时才需要关闭通道 寻找关闭。关闭通道是一个控制信号 通道指示没有更多数据跟随。

          Design Question: Channel Closing

          【讨论】:

          • 我不确定我是否同意链接的响应。我有 2GB 范围内的内存泄漏。一旦我添加关闭,间歇泉就变成了涓涓细流。
          • @Richard:仔细阅读整个线程。 Go的作者gcgccgo的作者说频道closes不是必须的,除非你正在寻找close。这是权威的建议。
          • @peterSO,可能是这样,但我知道我看到了什么,这就是我报告的,所以请不要解雇我。
          • 好吧,如果你有一个缓冲通道,向它添加消息应该会占用内存。但是,如果您的频道没有缓冲或没有添加任何内容,则内存使用量不会增加。
          【解决方案5】:

          是的,让通道保持打开状态是可以的,实际上这是典型的。打开的通道并不构成对通道对象的引用,因此不会阻止它被垃圾回收。

          【讨论】:

            【解决方案6】:

            Go 是垃圾收集器,因此您实际上不必“释放”任何东西。

            有可能关闭通道,但它主要用作 - close(channel) - 告诉 goroutine(或主程序)不会在该通道上发送任何其他内容。

            【讨论】:

            • AFAIK 即使在垃圾收集语言中,程序员仍然负责释放非托管资源,例如关闭文件,套接字等等。我需要像关闭文件一样关闭频道吗?
            • @Kluyg 答案是否定的。您正在谈论操作系统资源(哪些渠道不是)。它取决于资源和语言,但通常建议手动关闭操作系统资源,不是因为 GC 不会这样做,而是因为它是不确定的。最常见的相关 gotchatoo many open files 错误。您不断打开文件...您希望 GC 这样做...您不会耗尽内存(因此 GC 不会启动)...您在操作系统级别用完了文件描述符。操作系统杀死进程:)
            • 我很困惑为什么这得到了如此多的反对,而它一直都是正确的,并且与其他接受的答案一样......
            猜你喜欢
            • 2013-11-13
            • 2014-05-04
            • 2010-12-15
            • 2020-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多