gpt4 book ai didi

multithreading - 如何在不等待另一个 goroutine 中设置的情况下读取 channel ?

转载 作者:行者123 更新时间:2023-12-01 20:19:48 26 4
gpt4 key购买 nike

我在 goroutine 中使用 channel 有问题。

var test = make(chan string)

func main() {
go initChan()

for i := 0; i < 2; i++ {
go readChan()
}

var input string
fmt.Scanln(&input)
}

func initChan() {
for i := 0; i < 100; i++ {
test <- "Iteration num: " + strconv.Itoa(i)
time.Sleep(time.Second * 5)
}
}

func readChan() {
for {
message := <- test
log.Println(message)
}
}

输出:
2019/12/24 08:21:17 Iteration num: 0
2019/12/24 08:21:22 Iteration num: 1
2019/12/24 08:21:27 Iteration num: 2
2019/12/24 08:21:32 Iteration num: 3
2019/12/24 08:21:37 Iteration num: 4
2019/12/24 08:21:42 Iteration num: 5
................................

我需要线程读取而无需等待测试变量的更新。
现在每个 readChan() 都在等待 initChan() 更新测试变量。

是否可以让 readChan() 线程一次性工作而无需为每个线程等待 initChan()?

最佳答案

创建了一个恶魔,它将所有消息从测试 channel 推送到所有其他监听程序。

var test = make(chan string)

var mapChan = make(map[int]chan string)
var count = 3

func main() {
go initChan()
go deamon()
for i := 0; i < count; i++ {
mapChan[i] = make(chan string)
go readChan(i)
}

var input string
fmt.Scanln(&input)
}

func deamon() {
for {
message := <-test
for i := 0; i < count; i++ {
mapChan[i] <- message
}
}
}

func initChan() {
for i := 0; i < 100; i++ {
test <- "Iteration num: " + strconv.Itoa(i)
time.Sleep(time.Second * 1)
}
}

func readChan(i int) {
for {
select {

case message := <-mapChan[i]:
log.Println(message)
default:
// Do for not when written on channel
}
}
}

关于multithreading - 如何在不等待另一个 goroutine 中设置的情况下读取 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59463846/

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