gpt4 book ai didi

go - chan bool 是如何让 goroutine 等待的?

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:18 27 4
gpt4 key购买 nike

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

我发现使用 sync.WaitGroup 更为惯用,但我很好奇 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

最佳答案

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

A done channel 是一种常见的阻塞方式,直到操作完成。它是这样使用的:

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

channel 的类型并不重要,因为没有数据(必然)通过 channel 发送,所以 bool有效,但是 struct{}更符合惯用语,因为它表示无法发送任何数据。

你的例子几乎做到了这一点,只是它从不调用 close(done) .这是一个错误。这意味着代码将永远等待 <-done。 ,从而否定了完成 channel 的全部目的。您的示例代码将永远不会退出

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

go func() {
// Do stuff
}()
// Do other stuff
<Any code that blocks forever>

因为有无数种方法可以永久阻止——它们在实践中都没有用——不需要示例中的 channel 。

关于go - chan bool 是如何让 goroutine 等待的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56061969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com