Go语言 可以让频道保持打开状态吗?

brccelvz  于 2022-12-16  发布在  Go
关注(0)|答案(8)|浏览(164)

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

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

wfauudbj1#

让Go语言的通道永远打开并且永远不关闭是可以的。当通道不再使用时,它将被垃圾收集。
注意,只有当接收机正在寻找关闭通道时才需要关闭通道,关闭通道是通道上的一个控制信号,指示没有更多的数据跟随。
Design Question: Channel Closing

vsnjm48y

vsnjm48y2#

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

**只有在需要通知接收方goroutine所有数据都已经发送的时候才需要关闭通道。**一个被垃圾收集器确定为不可达的通道,无论是否关闭,都会回收它的资源。(不要将此操作与打开文件的关闭操作相混淆。当您完成对每个文件的操作时,调用 Close 方法是非常重要的。)

gorkyyrv

gorkyyrv3#

是的,保持通道打开是可以的,事实上这是很典型的,一个打开的通道并不构成对通道对象的引用,因此并不阻止它被垃圾收集。

hiz5n14c

hiz5n14c4#

使用Go通道的一个一般原则是,不要从接收端关闭通道,并且如果通道有多个并发发送方,也不要关闭通道。
正如上面的回答中明确提到的,每个通道在标记为清理后最终都会被GCed,因此可以不关闭通道,唯一的区别是,如果没有明确关闭,则该通道在几个周期后将可用于gc
此外,以下文章thisthis显示了在1:N、N:1或M:N(发送方:接收方)的情况下关闭通道的各种方法

cig3rfwq

cig3rfwq5#

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

**另一个注意事项:**频道不像文件;你通常不需要关闭它们,只有当接收者必须被告知没有更多的值到来时才需要关闭,比如终止一个range循环。

pu82cl6c

pu82cl6c6#

这并不总是正确的。保持通道打开可能会导致内存泄漏,这取决于你如何编码它。
虽然GO是垃圾收集的,但是如果一个Goroutine因为某种原因使用了一个通道而被阻塞(而保持通道打开可能是goroutine被阻塞的原因之一),你就会有一个内存泄漏。
这是一篇关于通道、goroutine的使用以及它们如何与golang中的大多数内存泄漏问题相关联的好文章。
https://betterprogramming.pub/common-goroutine-leaks-that-you-should-avoid-fe12d12d6ee

wydwbb8l

wydwbb8l7#

Go语言是垃圾收集的,所以你真的不需要“释放”任何东西。
关闭通道是有可能的,但它通常被用作- close(channel)-告诉goroutine(或主程序)在那个通道上不会再发送任何东西。

omqzjyyz

omqzjyyz8#

如果你手动关闭通道,你会节省一些垃圾收集器的任务,从而节省一些计算和加快你的程序一点点。

相关问题