Goroutine并发管理
在 Go 语言中,错误组(error group)通常指一组 goroutine 的集合,这些 goroutine 可能会并发地执行一些任务,但是需要一种机制来协调它们的行为,尤其是在错误处理方面。
信号(signal)在操作系统中是一种很常见的机制,用于通知进程发生了一些特定的事件,比如操作系统的中断、退出等。在 Go 中,我们经常需要在程序中监听系统信号,以便在接收到信号时执行一些特定的逻辑,比如优雅地关闭服务、释放资源等。
退出信号的处理
Prometheus 也有一个库 "github.com/oklog/run"现在习惯用`github.com/ning1875/errgroup-signal`
带有 sig 的 goroutine 编排基础库
esl引用
// 初始化这个group
// stopChan 有值,说明要退出 esl "github.com/ning1875/errgroup-signal/signal"
group, stopChan := esl.SetupStopSignalContext()
ctxAll, cancelAll := context.WithCancel(context.Background())
// 首先添加一个退出信号管理
group.Go(func() error {
logger.Info("[stopchan监听启动]")
for {
select {
case <-stopChan:
logger.Info("捕获退出信号 停止ctx 通知所有任务退出")
cancelAll()
return nil
}
}
})
// 在里面添加你的任务
group.Go(func() error {
})
group.Go(func() error {
errChan := make(chan error, 1)
go func() {
errChan <- web.StartGin(sc)
}()
logger.Info("web启动成功")
select {
case err := <-errChan:
logger.Error("gin报错", zap.Error(err))
return err
case <-ctxAll.Done():
logger.Info("gin收到其他任务退出信号 退出")
return nil
}
})
group.Wait()
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Hunter
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果