请教一个 Go 的问题 如何确保缓冲 channel 关闭之后数据被全部读完呢?

2019-05-10 21:18:01 +08:00
 mokeychan

如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了?

2596 次点击
所在节点    Go 编程语言
6 条回复
SimonDing
2019-05-10 21:28:19 +08:00
range 来耗尽 channel?
a719114136
2019-05-10 21:43:29 +08:00
处理 channel 之前用 waitGroup 记一下,退出时等待 waitgroup 变为 0
dreampuf
2019-05-10 21:45:37 +08:00
由 producer 关闭
liulaomo
2019-05-10 21:54:37 +08:00
@SimonDing 说的对。

或者如下手动,其实和 for v := range c { use(v) } 是等价的。
for {
v, closed := <-c;
if closed (
break
}
// use v ...
}
cabing
2019-05-10 22:02:45 +08:00
这个加个方法 waitGroup 监听下吧。

在主线程上加个 w.Add(1)

在这里可以手动关闭吧。 close(xxx)

wg.wait();

做一个开关 chan
go func(chan a interface{}){

for xxxx{
do something...
}
wg.done();

}
janxin
2019-05-11 18:20:48 +08:00
代码组织设计时考虑,由生产者关闭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX