如果我从来不检查Go通道的状态,可以让它永远打开(永远不关闭通道)吗?这会导致内存泄漏吗?下面的代码可以吗?
func (requestCh chan<- Request) GetResponse(data RequestData) Response { reply := make(chan Response) requestCh <- Request{data: data, replyCh: reply} return <-reply }
wfauudbj1#
让Go语言的通道永远打开并且永远不关闭是可以的。当通道不再使用时,它将被垃圾收集。注意,只有当接收机正在寻找关闭通道时才需要关闭通道,关闭通道是通道上的一个控制信号,指示没有更多的数据跟随。Design Question: Channel Closing
vsnjm48y2#
是的,保持一个通道打开是可以的。正如the go programming language书中所说:
**只有在需要通知接收方goroutine所有数据都已经发送的时候才需要关闭通道。**一个被垃圾收集器确定为不可达的通道,无论是否关闭,都会回收它的资源。(不要将此操作与打开文件的关闭操作相混淆。当您完成对每个文件的操作时,调用 Close 方法是非常重要的。)
gorkyyrv3#
是的,保持通道打开是可以的,事实上这是很典型的,一个打开的通道并不构成对通道对象的引用,因此并不阻止它被垃圾收集。
hiz5n14c4#
“使用Go通道的一个一般原则是,不要从接收端关闭通道,并且如果通道有多个并发发送方,也不要关闭通道。”正如上面的回答中明确提到的,每个通道在标记为清理后最终都会被GCed,因此可以不关闭通道,唯一的区别是,如果没有明确关闭,则该通道在几个周期后将可用于gc。此外,以下文章this和this显示了在1:N、N:1或M:N(发送方:接收方)的情况下关闭通道的各种方法
gc
cig3rfwq5#
上面已经很好地介绍了这一点,但是我发现A Tour of Go中的以下内容非常清楚,这也给出了何时使用close的示例:
close
**另一个注意事项:**频道不像文件;你通常不需要关闭它们,只有当接收者必须被告知没有更多的值到来时才需要关闭,比如终止一个range循环。
range
pu82cl6c6#
这并不总是正确的。保持通道打开可能会导致内存泄漏,这取决于你如何编码它。虽然GO是垃圾收集的,但是如果一个Goroutine因为某种原因使用了一个通道而被阻塞(而保持通道打开可能是goroutine被阻塞的原因之一),你就会有一个内存泄漏。这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee
wydwbb8l7#
Go语言是垃圾收集的,所以你真的不需要“释放”任何东西。关闭通道是有可能的,但它通常被用作- close(channel)-告诉goroutine(或主程序)在那个通道上不会再发送任何东西。
omqzjyyz8#
如果你手动关闭通道,你会节省一些垃圾收集器的任务,从而节省一些计算和加快你的程序一点点。
8条答案
按热度按时间wfauudbj1#
让Go语言的通道永远打开并且永远不关闭是可以的。当通道不再使用时,它将被垃圾收集。
注意,只有当接收机正在寻找关闭通道时才需要关闭通道,关闭通道是通道上的一个控制信号,指示没有更多的数据跟随。
Design Question: Channel Closing
vsnjm48y2#
是的,保持一个通道打开是可以的。正如the go programming language书中所说:
**只有在需要通知接收方goroutine所有数据都已经发送的时候才需要关闭通道。**一个被垃圾收集器确定为不可达的通道,无论是否关闭,都会回收它的资源。(不要将此操作与打开文件的关闭操作相混淆。当您完成对每个文件的操作时,调用 Close 方法是非常重要的。)
gorkyyrv3#
是的,保持通道打开是可以的,事实上这是很典型的,一个打开的通道并不构成对通道对象的引用,因此并不阻止它被垃圾收集。
hiz5n14c4#
“使用Go通道的一个一般原则是,不要从接收端关闭通道,并且如果通道有多个并发发送方,也不要关闭通道。”
正如上面的回答中明确提到的,每个通道在标记为清理后最终都会被GCed,因此可以不关闭通道,唯一的区别是,如果没有明确关闭,则该通道在几个周期后将可用于
gc
。此外,以下文章this和this显示了在1:N、N:1或M:N(发送方:接收方)的情况下关闭通道的各种方法
cig3rfwq5#
上面已经很好地介绍了这一点,但是我发现A Tour of Go中的以下内容非常清楚,这也给出了何时使用
close
的示例:**另一个注意事项:**频道不像文件;你通常不需要关闭它们,只有当接收者必须被告知没有更多的值到来时才需要关闭,比如终止一个
range
循环。pu82cl6c6#
这并不总是正确的。保持通道打开可能会导致内存泄漏,这取决于你如何编码它。
虽然GO是垃圾收集的,但是如果一个Goroutine因为某种原因使用了一个通道而被阻塞(而保持通道打开可能是goroutine被阻塞的原因之一),你就会有一个内存泄漏。
这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。
https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee
wydwbb8l7#
Go语言是垃圾收集的,所以你真的不需要“释放”任何东西。
关闭通道是有可能的,但它通常被用作- close(channel)-告诉goroutine(或主程序)在那个通道上不会再发送任何东西。
omqzjyyz8#
如果你手动关闭通道,你会节省一些垃圾收集器的任务,从而节省一些计算和加快你的程序一点点。