V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
mokeychan
V2EX  ›  Go 编程语言

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

  •  
  •   mokeychan · 2019-05-10 21:18:01 +08:00 · 2659 次点击
    这是一个创建于 2015 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2019-05-11 18:20:48 +08:00
    SimonDing
        1
    SimonDing  
       2019-05-10 21:28:19 +08:00 via Android
    range 来耗尽 channel?
    a719114136
        2
    a719114136  
       2019-05-10 21:43:29 +08:00 via Android
    处理 channel 之前用 waitGroup 记一下,退出时等待 waitgroup 变为 0
    dreampuf
        3
    dreampuf  
       2019-05-10 21:45:37 +08:00
    由 producer 关闭
    liulaomo
        4
    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
        5
    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
        6
    janxin  
       2019-05-11 18:20:48 +08:00
    代码组织设计时考虑,由生产者关闭
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5435 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 07:05 · PVG 15:05 · LAX 23:05 · JFK 02:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.