合并两个关闭通道
Merge two closing channels
有两个通道将用于通过关闭它们来发送信号。如何从它们中创建一个通道,如果其中至少一个通道关闭,该通道将被关闭。此代码说明了我想做什么:
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
}
没有子程序可以实现吗?
如果您想 return "merged" 频道需要关闭之前,否。
但这不是问题,您在其中启动的 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
s)。
有两个通道将用于通过关闭它们来发送信号。如何从它们中创建一个通道,如果其中至少一个通道关闭,该通道将被关闭。此代码说明了我想做什么:
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
}
没有子程序可以实现吗?
如果您想 return "merged" 频道需要关闭之前,否。
但这不是问题,您在其中启动的 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
s)。