0

我有以下代码片段。我创建了一个通道,该通道最多从给定目录中获取 15 个文件名。我认为我可以创建 goroutines,其中一个在通道上生成条目,另一个消耗它们。消费者应该打印从渠道中取出的东西。

我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠——不是为 for 循环的每次迭代都启动了一个新的 go 例程吗?最终不应该从频道打印一些东西吗?

func (u* uniprot) produce(n string) {
    u.namesInDir <- n
}   

func (u* uniprot) consume() {
    fmt.println(<-u.namesInDir)
}       

func (u* uniprot) readFilenames(dirname string) {
    u.namesInDir = make(chan string, 15)
    dir, err := os.Open(dirname)
    errorCheck(err) 
    names, err := dir.Readdirnames(0)
    errorCheck(err)
    for _, n := range names {
        go u.produce(n)
        go u.consume()
    }
}
4

1 回答 1

5

您需要等待 goroutine 完成。

要查看问题,请将 atime.Sleep放在 for 循环的末尾。

要正确修复,请使用sync.WaitGroup

这是它如何工作的示例(未经测试)

import "sync"

func (u *uniprot) produce(n string, wg *sync.WaitGroup) {
    defer wg.Done()
    u.namesInDir <- n
}

func (u *uniprot) consume(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.println(<-u.namesInDir)
}

func (u *uniprot) readFilenames(dirname string) {
    u.namesInDir = make(chan string, 15)
    dir, err := os.Open(dirname)
    errorCheck(err)
    names, err := dir.Readdirnames(0)
    errorCheck(err)
    wg := new(sync.WaitGroup)
    for _, n := range names {
        wg.Add(2)
        go u.produce(n, wg)
        go u.consume(wg)
    }
    wg.Wait()
}
于 2013-09-28T19:31:28.407 回答