2011-12-21 152 views
78

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

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

回答

106

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

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

Design Question: Channel Closing

+0

我不确定我是否同意链接的回应。我在2GB范围内有内存泄漏。一旦我添加了关闭,喷泉就成了滴水。 – Richard 2013-04-01 20:07:50

+0

@理查德:仔细阅读整篇文章。 Go'gc'的作者和'gccgo'的作者说''close's不是必须的,除非你正在寻找'close'。这是权威性的建议。 – peterSO 2013-04-02 06:05:30

+1

@peterSO,可能是,但我知道我看到了什么,这就是我所报道的,所以请不要解雇我。 – Richard 2013-04-02 18:05:23

-1

Go是垃圾收集,所以你不必“自由”任何东西。

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

+6

AFAIK程序员仍然负责释放非托管资源,例如关闭文件,套接字等等。我是否需要像文件一样关闭频道? – Kluyg 2011-12-21 17:32:18

+0

@Kluyg答案是否定的。你在谈论OS资源(哪些频道不是)。它取决于资源和语言,但通常建议手动关闭操作系统资源,而不是因为GC不这样做,而是因为它不确定。最常见的相关_gotcha_是许多打开文件_错误。你继续打开文件...你希望GC这样做......你没有用完内存(因此GC没有启动)......你在操作系统级别耗尽了文件描述符。 OS杀死进程:) – Pijusn 2017-04-14 03:34:17

1

是的,这是确定要离开的通道打开,而实际上它是典型的。正在打开的频道不构成对频道对象的引用,因此不会阻止它被垃圾收集。

11

是的,可以保持通道畅通。由于the go programming language书陈述:

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

相关问题