为了账号安全,请及时绑定邮箱和手机立即绑定

合并两个关闭通道

合并两个关闭通道

Go
慕无忌1623718 2023-06-01 17:02:17
有两个通道将用于通过关闭它们来发送信号。如何从它们中创建一个通道,如果其中至少一个通道关闭,该通道将被关闭。这段代码说明了我想做什么: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}是否可以在没有子程序的情况下实现这一目标?
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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


但这不是问题,您在其中启动的 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,那么不要合并它们(case在需要监控的地方添加 2 s)。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信