1 回答
TA贡献1860条经验 获得超8个赞
您可以在select声明之外完成您的工作,然后在票据通道案例中继续。这将立即执行您的工作一次,然后每次自动收报机滴答作响。
您的函数看起来不错,但最好尽可能使用上下文。
许多包(数据库、IO 等)都可以选择指定上下文,这通常用于定义超时。在您的情况下,将相同(或子)上下文传递给这些包将意味着它们也尊重 sigterm。
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx := cancelCtxOnSigterm(context.Background())
startWork(ctx)
}
// cancelCtxOnSigterm returns a Context that will be cancelled when the program receives a sigterm.
func cancelCtxOnSigterm(ctx context.Context) context.Context {
exitCh := make(chan os.Signal, 1)
signal.Notify(exitCh, os.Interrupt, syscall.SIGTERM)
ctx, cancel := context.WithCancel(ctx)
go func() {
<-exitCh
cancel()
}()
return ctx
}
// startWork performs a task every 60 seconds until the context is done.
func startWork(ctx context.Context) {
ticker := time.NewTicker(60 * time.Second)
defer ticker.Stop()
for {
// Do work here so we don't need duplicate calls. It will run immediately, and again every minute as the loop continues.
if err := work(ctx); err != nil {
fmt.Printf("failed to do work: %s", err)
}
select {
case <-ticker.C:
continue
case <-ctx.Done():
return
}
}
}
func work(ctx context.Context) error {
fmt.Println("doing work")
return nil
}
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报