- 79
- 0
问题描述
我有这样一个程序,他从一个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就是阻塞的了
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
你期待的结果是什么?实际看到的错误信息又是什么?
0
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
