在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《Golang 模式一次杀死多个 goroutine》,聊聊,希望可以帮助到正在努力赚钱的你。
问题内容我有两个 goroutine,如下面的代码片段所示。我想同步它们,以便当一个返回时,另一个也应该退出。 go 中实现这一目标的最佳方法是什么?
func main() {
go func() {
...
if err != nil {
return
}
}()
go func() {
...
if err != nil {
return
}
}()
}
我在这里模拟了这个场景 https://play.golang.org/p/iqawstxt7rt 并尝试用一个通道来表示例程已完成来解决它。这看起来可能会对关闭的通道进行写入,从而导致恐慌。解决这个问题的最佳方法是什么?
解决方案
您可以使用上下文在两个 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()
}
终于介绍完啦!小伙伴们,这篇关于《Golang 模式一次杀死多个 goroutine》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!