“or-done channel”是一种并发模式,用于处理多个通道之间的选择操作,尤其是在需要监听多个通道并在其中一个完成或发送信号后立即停止整个操作时非常有用。
or-done channel模式的核心思想是创建一个“done”通道,当该通道关闭时,所有其他与之关联的操作都将停止。这种模式通常用于取消goroutine,防止goroutine泄漏,或者在需要超时和取消功能时使用。
下面是一个简单的or-done channel模式实现示例:
package main
import (
"fmt"
"time"
)
// orDone函数接收一个done通道和一个输入通道,将输入通道中的数据传送到返回的通道中,直到done通道关闭
func orDone(done, c <-chan interface{}) <-chan interface{} {
valStream := make(chan interface{})
go func() {
defer close(valStream)
for {
select {
case <-done:
return
case v, ok := <-c:
if !ok {
return
}
select {
case valStream <- v:
case <-done:
}
}
}
}()
return valStream
}
func main() {
done := make(chan interface{})
defer close(done)
// 模拟一个数据源通道
myChan := make(chan interface{})
go func() {
defer close(myChan)
for i := 0; i < 10; i++ {
myChan <- i
time.Sleep(500 * time.Millisecond)
}
}()
// 使用orDone模式监听数据源通道
for val := range orDone(done, myChan) {
fmt.Println(val)
time.Sleep(1 * time.Second) // 模拟处理时间
}
}
**
在这个示例中,orDone函数将传入的done通道和数据源通道c结合,返回一个新的通道valStream。在main函数中,数据源通道myChan提供了一系列整数数据,orDone函数用于在done通道关闭时停止从myChan读取数据。
or-done channel模式特别适用于需要及时停止goroutine的场景,避免资源泄漏,并确保系统资源得到有效管理