我如何等待我的 goroutines 在 beego 中终止

How do I wait for the termination of my goroutines in beego

我有 n 个 goroutines 在任务通道上等待。这些 goroutines 负责执行这些任务。目前,我使用 beego 作为我的 web golang 框架。 什么时候 我会在 beego 应用程序中向我的 goroutines 发出终止信号?如何推断何时收到服务终止请求?

第一步,让我们创建一个通道并将其绑定到您感兴趣的信号。然后您需要创建上下文并在收到此信号时触发取消功能。

c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
ctx, cancel := context.WithCancel(context.Background()) // pass your ctx in all goroutines as first argument, 
go func() {
    signal := <-c
    logger.Info("signal was received", zap.Stringer("signal", signal)
    cancel()
}()

然后,您可以创建 WaitGroup 并将您的上下文作为第一个参数传递给每个 goroutine

wg := &sync.WaitGroup{}
hooks.RunStartHooks(ctx, wg)

在您的 worker 中听取上下文取消,如文档中指定的那样与 wg 适当地工作

for {

    select {

    case <-ctx.Done():
        wg.Done()
        return
    }

    // other cases
}

最后,

    timeout := cfg.Server.HooksCloseTimeout // this is from your config 
    if waitTimeout(wg, timeout) {
        logger.Info("timed out waiting for wait group")
    } else {
        logger.Info("server exited properly")
    }

其中 waitTimeout 是

// waitTimeout waits for the waitgroup for the specified max timeout.
// Returns true if waiting timed out.
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    go func() {
        defer close(c)
        wg.Wait()
    }()
    select {
    case <-c:
        return false // completed normally
    case <-time.After(timeout):
        return true // timed out
    }
}