【发布时间】:2020-03-18 06:10:47
【问题描述】:
其实我正在尝试做这样的事情:
我有一个生产者和一个消费者,消费者每隔几分钟检查一次并计算频道中的事件。但是当我尝试在 go playground 中测试它时,我发现:
package main
import (
"fmt"
"time"
)
func main() {
c1 := make(chan string, 1)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
c1 <- "result 1"
}
quit <- 1
}()
count := 0
for stop := false; !stop; {
for bk := false; !bk; {
select {
case _, ok := <-c1:
if ok {
count++
}
default:
bk = true
fmt.Println("default")
}
}
select {
case <-quit:
fmt.Println("stop")
stop = true
default:
}
fmt.Println(count)
time.Sleep(time.Second / 10)
}
fmt.Println("over")
}
不管我睡多久,从time.Second/10到time.Second*10, 输出将是:
default
0
default
2
default
4
default
6
default
8
default
10
default
stop
10
over
为什么 goroutine 只能在通道中放置 2 个事件? 我想要类似的东西:
default
0
default
stop
10
over
问题是通道大小,我只是从其他代码中复制而不检查...
【问题讨论】:
-
我承认我不知道你的代码试图做什么。
-
正如我所提到的,消费者每隔几秒就会尝试对频道中的事件进行计数。到目前为止,我希望消费者检索频道中的所有事件。但是输出显示 goroutine 以与消费者检查它相同的速度推送值。无论消费者在每次检查后休眠多长时间,都会收到 2 个新事件。
-
如果您想在频道中添加更多事件,为什么要将其大小设置为只能容纳 1 个?
-
你是对的,问题是频道大小。