是否可以打开频道?

Klu*_*uyg 142 channel go

如果我从不检查其状态,是否可以永久打开Go通道(从不关闭通道)?它会导致内存泄漏吗?以下代码可以吗?

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

pet*_*rSO 203

将Go频道永远打开并永不关闭它是可以的.当不再使用该频道时,它将被垃圾收集.

请注意,如果接收器正在寻找关闭,则只需关闭通道.关闭通道是通道上的控制信号,表示不再有数据.

设计问题:频道关闭

  • @Richard:仔细阅读整个帖子.Go`gc`的作者和`gccgo`的作者说通道`close`s是没有必要的,除非你正在寻找'close`.这是权威的建议. (5认同)
  • @peterSO,可能是,但我知道我所看到的,这就是我所报告的,所以请不要解雇我. (4认同)
  • 我不确定我同意链接的响应.我在2GB范围内有内存泄漏.一旦我添加了关闭,间歇泉变得涓涓细流. (2认同)

ciz*_*ixs 27

是的,可以保持频道开放.正如go编程语言书所述:

完成后,您无需关闭每个频道.只有在告知接收goroutine所有数据都已发送时,才需要关闭通道.垃圾收集器确定无法访问的通道将回收其资源,无论它是否已关闭.(不要将此与打开文件的关闭操作混淆.完成后对每个文件调用Close方法很重要 .)


use*_*641 8

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

另请注意:通道不像文件;它不像文件。您通常不需要关闭它们。仅当必须告诉接收者没有更多值到来时才需要关闭,例如终止循环range


Son*_*nia 6

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


小智 5

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

正如上面的回答中明确提到的那样,每个通道一旦被标记为清理,最终都会被 GC,所以可以让通道保持未关闭状态,唯一的区别是该通道将gc在几个周期后可用,如果没有明确关闭。

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