我如何等待我的 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
}
}
我有 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
}
}