【问题标题】:What happens to the channels that are not "selected"?未“选择”的频道会怎样?
【发布时间】:2021-04-03 20:22:13
【问题描述】:

根据GOPL,“选择等待,直到某些情况下的通信准备好进行”,那么未选择的通道会发生什么?此外,向“未选择”通道发送消息的 goroutine 是否会卡住,从而导致 goroutine 泄漏?

还是因为“未选中”的通道不可达,被GC回收(立即?),卡住的goroutine也被回收?

【问题讨论】:

  • Goroutines 不会被“收集”(终止并释放它们的资源),直到它们正在运行的函数完成其执行或恐慌并使进程崩溃。请记住,通道发送操作也是有效的select 情况,因此您可以尝试在通道上发送,但如果发送在设定的时间内没有成功,则超时并执行其他操作(例如终止 goroutine)。

标签: go concurrency channel


【解决方案1】:

未选择的频道将保持“原样”。更准确地说,未被选中的通信操作不会被执行。

这是否会导致您的应用出现死锁或 goroutine 泄漏完全取决于您的应用。您可能有多个 goroutine 在这些通道上发送/接收,select 可能在循环中重复执行select,最终执行所有准备好的通信操作。

通道——就像 Go 中的所有值一样——在它们变得无法访问时被垃圾收集,也就是说,没有 Go 代码对它们有“引用”。如果一个 goroutine 被阻塞试图从一个通道发送/接收,这被认为是对通道的“引用”,因此垃圾收集器不能“挽救”那个通道。

垃圾收集器不是解决死锁情况的工具,而是释放无法访问的未使用内存的工具。 必须考虑解决死锁。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2018-03-15
    • 2013-11-28
    • 2015-01-15
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2019-01-30
    • 2016-10-08
    相关资源
    最近更新 更多