如何从动态通道列表中读取数据而不为每个通道生成 goroutine

问题描述 投票:0回答:1

我知道在 golang 中生成 goroutine 非常便宜,但出于好奇 - 假设我们有这个:


    go func() {
        for {
            select {
            case <-stop:
                return // Stop goroutine when stop signal is received
            default:
                // Read from each channel
                for _, ch := range channels {
                    select {
                    case val := <-ch:
                        fmt.Printf("Received from channel: %d\n", val)
                    default:
                        // If channel is empty, continue to the next channel
                    }
                }
                time.Sleep(time.Millisecond * 100) // Add a short delay to prevent busy-waiting
            }
        }
    }()

在上面,我们有一个动态列表(频道),但它将按顺序阻止每个频道。我正在寻找的基本上是一个“动态选择”语句,它具有动态数量的 case 语句(在编译时不存在)。

可能没有必要避免为每个通道创建不同的 goroutine,但此时我只是好奇是否可能

go goroutine go-channels golang-channels
1个回答
0
投票

可以使用

reflect.Select
:

chn1:=reflect.ValueOf(channel1)
...
cases:=[]reflect.SelectCase{
  {
     Dir: reflect.SelectRecv,
     Chan: chn1,
  },
  {
     Dir: reflect.SelectRecv,
     Chan: chn2,
  }
}

...
chosen, value, ok:=reflect.Select(cases)
© www.soinside.com 2019 - 2024. All rights reserved.