go - 合并两个关闭通道
问题描述
有两个通道将用于通过关闭它们来发出信号。如果其中至少一个被关闭,如何从它们中创建一个将关闭的通道。这段代码说明了我想做的事情:
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,那么不要合并它们(case
在需要监控的地方添加 2 s)。
推荐阅读
- c++ - constexpr 使成员不可见
- java - 如何在 JNI 代码中获取 Android 上的 root 访问权限
- arrays - 根据if条件python3将变量附加到列表
- c++ - 字符数组的多字符文字
- css - 有没有办法让导航栏下拉菜单在折叠的导航栏下方展开?
- java - 如何将应用程序用户名和密码从詹金斯传递给 Maven
- android - 谷歌地图视图生成大量 Firebase 数据库读取操作
- python - 我有一个包含许多 .tar.gz 文件的文件夹。在python中,我想进入每个文件解压缩或压缩并找到包含我要提取的字符串的文本文件?
- c - 多个线程查找整数的素数,分段错误
- sql - 用左连接计数