为了账号安全,请及时绑定邮箱和手机立即绑定

我如何等待beego中的goroutines终止

我如何等待beego中的goroutines终止

Go
隔江千里 2022-06-06 17:04:31
我有 n 个 goroutine 在任务通道上等待。这些 goroutine 负责执行这些任务。目前,我使用 beego 作为我的 web golang 框架。我什么时候在 beego 应用程序中向我的 goroutine 发出终止信号?收到服务终止请求时如何推断?
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


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)

在您的工作人员内部,按照文档中的规定,聆听与 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

    }

}


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信