在本例中,如何使用Go例程?

在本例中,如何使用Go例程?,go,Go,我有以下代码片段。我创建了一个通道,从给定目录中最多获取15个文件名。我认为我可以创建goroutine,其中一个在频道上生成条目,另一个使用它们。消费者应打印从频道获取的内容 我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠——for循环的每个迭代不是都会启动一个新的go例程吗?难道最终不应该有什么东西从频道上打印出来吗 func (u* uniprot) produce(n string) { u.namesInDir <- n } func (u* u

我有以下代码片段。我创建了一个通道,从给定目录中最多获取15个文件名。我认为我可以创建goroutine,其中一个在频道上生成条目,另一个使用它们。消费者应打印从频道获取的内容

我的程序在没有打印的情况下执行,我怀疑这是因为消费者例程正在休眠——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()
    }
}
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()
}