如何等待goroutines完成并没有锁定读取频道?

时间:2018-04-08 11:52:04

标签: go goroutine

我在这里看了很多关于SO的例子和问题,但仍然无法按照预期的方式运行相当简单的代码:

func main() {
    ch := make(chan string)
    var wg sync.WaitGroup
    wg.Add(2)
    go readFile("A", ch, wg)
    go readFile("B", ch, wg)
    go func() {
        wg.Wait()
        close(ch)
    }()
    printer(ch)
}

func readFile(name string, ch chan string, wg sync.WaitGroup) {
    file, err := os.Open(name)
    if err != nil {
        fmt.Errorf("was not able to read from file %s: %s", name, err)
    }
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        ch <- scanner.Text()
    }
    wg.Done()
}

func printer(ch chan string) {
    for val := range ch {
        fmt.Println(val)
    }
}

所以我正在读取两个文件,将读取行推入一个通道,然后简单地将它们打印出来(一些代码从不需要的详细信息中简化)

两个goroutines,WaitGroup为他们两个,用Wait和close通道修复goroutine。

从我的观点来看,这与这个问题和豁免的答案非常相似:Let golang close used channel after all goroutines finished

那我的情况怎么了?

1 个答案:

答案 0 :(得分:2)

首先按照sync.WaitGroup说明的文档进行操作:

  

Package sync

import "sync"
     

type WaitGroup

     

WaitGroup等待完成goroutine的集合。主要的   goroutine调用Add来设置要等待的goroutines的数量。然后   每个goroutine运行并在完成后调用Done。在同一个   时间,等待可以用来阻止所有goroutines完成。

     

首次使用后不得复制WaitGroup。

  

首次使用后不得复制WaitGroup。