我有以下代码段。我创建了一个最多从给定目录获取15个文件名的通道。我认为我可以创建goroutines,其中一个在通道上生成条目,另一个消耗它们。消费者应该打印从频道中获取的内容。
我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠 - 是不是为for循环的每次迭代启动了一个新的例程?最终是否应该从频道打印出来?
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()
}
}
答案 0 :(得分:5)
你需要等待go例程完成。
要查看问题,请将time.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()
}