我有两个goroutine,如下面的代码片段所示。我想同步它们,以便当一个返回时,另一个也应该退出。实现此目标的最佳方法是什么?
func main() {
go func() {
...
if err != nil {
return
}
}()
go func() {
...
if err != nil {
return
}
}()
}
我在https://play.golang.org/p/IqawStXt7rt上模拟了这种情况,并尝试通过一个信号处理例程的 channel 解决它。看起来可能存在对关闭 channel 的写入操作,导致出现紧急情况。解决此问题的最佳方法是什么?
最佳答案
您可以使用上下文在两个go例程之间进行通信。
例如,
package main
import (
"context"
"sync"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
wg := sync.WaitGroup{}
wg.Add(3)
go func() {
defer wg.Done()
for {
select {
// msg from other goroutine finish
case <-ctx.Done():
// end
}
}
}()
go func() {
defer wg.Done()
for {
select {
// msg from other goroutine finish
case <-ctx.Done():
// end
}
}
}()
go func() {
defer wg.Done()
// your operation
// call cancel when this goroutine ends
cancel()
}()
wg.Wait()
}
关于go - Golang模式可一次杀死多个goroutine,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61007385/