1 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以在select聲明之外完成您的工作,然后在票據(jù)通道案例中繼續(xù)。這將立即執(zhí)行您的工作一次,然后每次自動(dòng)收報(bào)機(jī)滴答作響。
您的函數(shù)看起來不錯(cuò),但最好盡可能使用上下文。
許多包(數(shù)據(jù)庫、IO 等)都可以選擇指定上下文,這通常用于定義超時(shí)。在您的情況下,將相同(或子)上下文傳遞給這些包將意味著它們也尊重 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 關(guān)注
- 131 瀏覽
添加回答
舉報(bào)