gpt4 book ai didi

multithreading - go channel 可以保留一个值供多次读取

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:51 28 4
gpt4 key购买 nike

<分区>

我了解 channel 的常规行为是在读取后清空。有没有办法在不从 channel 中删除值的情况下为多次读取保留未缓冲的 channel 值?

例如,我有一个 goroutine,它生成单个数据供多个下游 go 例程使用。我不想必须创建多个 channel 或使用缓冲 channel ,这将需要我复制源数据(我什至不知道我需要多少副本)。实际上,我希望能够执行以下操作:

main{
ch := make(ch chan dType)

ch <- sourceDataGenerator()
for _,_ := range DynamicRange{
go TargetGoRoutine(ch)
}
close(ch) // would want this to remove the value and the channel
}
func(ch chan dType) TargetGoRoutine{
targetCollection <- ch // want to keep the channel value after read
}

编辑有些人认为这是一个重复的问题。也许,但不确定。正如 n-canter 指出的那样,这里的解决方案最终看起来很简单。它所需要的只是让每个 go 例程通过在使用后将数据放回 channel 来“回收”数据。没有一个所谓的“重复”提供了这个解决方案。这是一个示例:

package main
import (
"fmt"
"sync"
)

func main() {
c := make(chan string)
var wg sync.WaitGroup
wg.Add(5)

for i := 0; i < 5; i++ {
go func(i int) {
wg.Done()
msg := <-c
fmt.Printf("Data:%s, From go:%d\n", msg, i)
c <-msg

}(i)
}

c <- "Original"
wg.Wait()
fmt.Println(<-c)
}

https://play.golang.org/p/EXBbf1_icG

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com