我有这样一个程序,他从一个items列表中读取items,然后,打印一下这个item,交个一个channel
// 从out队列接收数据 for _,item := range result.Items { fmt.Println("got item: ",item) go func() { c.ItemChan <- item }() }
在另一个地方,起了一个goroutine,来接收
go func() { count := 0 for { item := <- out count++ fmt.Printf("获取到的item:%d,当前saver计数count是:%d\n",item,count) } }()
很简单的一个东西,但是发现。写入是打印的item没有重复,但读取的channel,打印有重复。
最后发现应该是写入是,channel阻塞,而外层循环还在继续,导致item更新了,然后在写入channel的已经是几个相同的item了
我尝试给写入添加sleep,这样只要确保这个被消费了,然后在写入,就没问题
for _,item := range result.Items { time.Sleep(time.Millisecond * 100) fmt.Println("got item: ",item) go func() { c.ItemChan <- item }() }
但显然,这个不符合需求。
那么,我的问题是,我有一个列表要不断读取,通过goroutine塞到一个channel里面,但这样会造成闭包问题,该怎么解决呢?
也许,将写入改成一个大的goroutine是个好办法?
goroutine包裹整个for循环,然后,此时在写入channel就是阻塞的了
// 请把代码文本粘贴到下方(请勿用图片代替代码)
Cats萌萌
缥缈止盈
相关分类