我有一个go-routine
将对象添加到通道,然后我有4 go-routines
来处理通道的对象。处理只不过是将对象添加到数组中。但是在很少的时候,这些对象从最终数组中丢失。所以我假设在某个时候频道停止收集对象。我有以下代码:去例行程序不收集来自通道的所有对象
package main
import (
"log"
"sync"
)
func main() {
j := 0
for {
if j == 10 {
break
}
wg := sync.WaitGroup{}
months := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"}
hits := make(chan string)
i := 0
wg.Add(1)
go func() {
defer close(hits)
for {
if i == 25 {
wg.Done()
return
}
for _, month := range months {
hits <- month
}
i++
}
}()
temp := []string{}
for updateWorker := 1; updateWorker <= 4; updateWorker++ {
wg.Add(1)
go func() {
for hit := range hits {
temp = append(temp, hit)
}
wg.Done()
return
}()
}
wg.Wait()
log.Printf("length of temp %+v\n", len(temp))
j++
}
}
我正在使用sync
库来同步例程。我正在循环相同的过程10次以测试输出是否一致。我期待这样的输出:
length of temp 175
它是175,因为我发送7个月字符串25次。 但有时输出小于175,我不知道为什么。我有点习惯性地去做例行公事。那么有人可以帮我找到原因吗?谢谢。