登录
首页 >  Golang >  Go问答

整合两个封闭的管道

来源:stackoverflow

时间:2024-03-03 20:36:24 213浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《整合两个封闭的管道》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

有两个通道将用于通过关闭它们来发送信号。如何从其中创建一个通道,如果至少其中之一关闭,该通道将被关闭。这段代码说明了我想做的事情:

func MergeChans(c1 chan struct{}, c2 chan struct{}) chan struct{} {
    c3 := make(chan struct{})
    go func() {
        select {
        case <-c1: close(c3)
        case <-c2: close(c3)
        }
    }()
    return c3
}

是否可以在没有子程序的情况下实现这一目标?


解决方案


如果您想在需要关闭之前返回“合并”通道,则不行。

但这不是问题,你在里面启动的 goroutine 将使用 0 cpu 资源。你不应该担心这个。

一旦其中一个通道关闭,函数就会结束,goroutine 就会正确终止。您只需确保至少有一个通道关闭即可。如果你不能保证这一点,goroutine 将永远不会终止,也永远不会被垃圾收集。如果您不控制通道,则可以传递第三个通道(或 context.context 值)来提供正确终止的方式,例如:

func MergeChans(c1, c2, shutdown chan struct{}) chan struct{} {
    c3 := make(chan struct{})
    go func() {
        select {
        case <-c1:
            close(c3)
        case <-c2:
            close(c3)
        case <-shutdown:
        }
    }()
    return c3
}

如果你想避免额外的 goroutine,那么就不要合并它们(在需要监控的地方添加 2 个 case)。

到这里,我们也就讲完了《整合两个封闭的管道》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>