登录
首页 >  Golang >  Go问答

chan bool 如何让 goroutine 等待?

来源:stackoverflow

时间:2024-04-12 23:36:36 300浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《chan bool 如何让 goroutine 等待?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在构建一个应用程序,以便在每次代码更改时运行命令。我使用 fsnotify 来实现此功能。但是,我不明白它是如何等待主 goroutine 的。

我发现使用 sync.waitgroup 更惯用,但我很好奇 done chan bool 如何使 goroutine 在 fsnotify 示例代码中等待。

我尝试在 fsnotify 的示例代码中删除 done,但它没有等待 goroutine,只是退出了。

watcher, err := fsnotify.NewWatcher()
if err != nil {
    log.Fatal(err)
}
defer watcher.Close()

done := make(chan bool)
go func() {
    for {
        select {
        case event, ok := <-watcher.Events:
            if !ok {
                return
            }
            log.Println("event:", event)
            if event.Op&fsnotify.Write == fsnotify.Write {
                log.Println("modified file:", event.Name)
            }
        case err, ok := <-watcher.Errors:
            if !ok {
                return
            }
            log.Println("error:", err)
        }
    }
}()

err = watcher.Add("/tmp/foo")
if err != nil {
    log.Fatal(err)
}
<-done

解决方案


我不完全确定您在问什么,但您提供的代码中有一个微妙的错误。

done 通道是阻塞直到操作完成的常用方法。它的使用方式如下:

done := make(chan x) // where x is any type
go func() {
    // some logic, possibly in a loop
    close(done)
}()
// other logic
<-done // wait for `done` to be closed

通道的类型并不重要,因为没有数据(必然)通过通道发送,因此 bool 可以工作,但 struct{} 更惯用,因为它表示无法发送数据。

您的示例几乎就是这样做的,只是它从不调用 close(done)。这是一个错误。这意味着代码将始终在 <-done 处永远等待,从而否定了完成通道的全部目的。您的示例代码将永远不会退出

这意味着您提供的代码也可以写为:

go func() {
    // Do stuff
}()
// Do other stuff

因为有无数种方法可以永远阻止 - 它们在实践中都没有用处 - 因此不需要示例中的通道。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《chan bool 如何让 goroutine 等待?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>