在 Go 语言中,错误组(error group)通常指一组 goroutine 的集合,这些 goroutine 可能会并发地执行一些任务,但是需要一种机制来协调它们的行为,尤其是在错误处理方面。

信号(signal)在操作系统中是一种很常见的机制,用于通知进程发生了一些特定的事件,比如操作系统的中断、退出等。在 Go 中,我们经常需要在程序中监听系统信号,以便在接收到信号时执行一些特定的逻辑,比如优雅地关闭服务、释放资源等。

多个goroutine并发管理可以参考此文章

退出信号的处理

  • 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()