在本例中,如何使用Go例程?
我有以下代码片段。我创建了一个通道,从给定目录中最多获取15个文件名。我认为我可以创建goroutine,其中一个在频道上生成条目,另一个使用它们。消费者应打印从频道获取的内容 我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠——for循环的每个迭代不是都会启动一个新的go例程吗?难道最终不应该有什么东西从频道上打印出来吗在本例中,如何使用Go例程?,go,Go,我有以下代码片段。我创建了一个通道,从给定目录中最多获取15个文件名。我认为我可以创建goroutine,其中一个在频道上生成条目,另一个使用它们。消费者应打印从频道获取的内容 我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠——for循环的每个迭代不是都会启动一个新的go例程吗?难道最终不应该有什么东西从频道上打印出来吗 func (u* uniprot) produce(n string) { u.namesInDir <- n } func (u* u
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()
}
}
func(u*uniprot)生成(n字符串){
u、 namesInDir您需要等待go例程完成
要查看问题,请在for循环的末尾放置一个time.Sleep
要正确修复,请使用
下面是一个如何工作的示例(未经测试)
导入“同步”
func(u*uniprot)product(n字符串,wg*sync.WaitGroup){
推迟工作组完成()
u、 namesInDir您需要等待go例程完成
要查看问题,请在for循环的末尾放置一个time.Sleep
要正确修复,请使用
下面是一个如何工作的示例(未经测试)
导入“同步”
func(u*uniprot)product(n字符串,wg*sync.WaitGroup){
推迟工作组完成()
u、 namesInDir亲爱的Nick。我加了一个sleep,它起作用了。为什么我需要等待它们呢?我想这就是我可以像那样发布线程的要点……那么只生产(仍然是go)是更好的做法吗,然后只消费?当主goroutine完成时,程序完成-这就是为什么你需要等待其他goroutine的原因。睡眠是一种粗糙的方式,但sync.WaitGroup是一种更好的方式。至于在go例程中生成vs消费-做对你的代码最有意义的事情。亲爱的尼克。我添加了睡眠,还有它成功了。为什么我需要等待它们呢?我认为这就是我可以像那样发布线程的要点……那么只生产(仍然是go)是更好的做法吗,然后只消费?当主goroutine完成时,程序完成-这就是为什么您需要等待其他goroutine的原因。睡眠是一种粗糙的方式,但sync.WaitGroup是一种更好的方式。至于在go例程中生成vs消费,请选择对您的代码最有意义的方式。
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()
}