合并两个关闭渠道

时间:2019-01-17 09:47:52

标签: go concurrency channel

有两个通道将通过关闭它们来发送信号。如果至少其中之一关闭,如何从它们中关闭一个通道。这段代码说明了我想做什么:

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 个答案:

答案 0 :(得分:1)

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

但这不是问题,您在内部启动的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)。