dingdayu-go-asyncGo 安全異步任務(wù)
Go 安全異步任務(wù)
基于 Go 的安全異步包。
安裝
go get github.com/dingdayu/async/v2
示例
package main
import (
"context"
"fmt"
"os"
"os/signal"
"sync"
"syscall"
"time"
"github.com/dingdayu/async/v2"
)
type ExampleAsync struct {
}
// OnPreRun: 運(yùn)行之前的調(diào)用, panic 會(huì)導(dǎo)致注冊(cè)失敗
func (a ExampleAsync) OnPreRun() {
fmt.Printf("\u001B[1;30;42m[info]\u001B[0m ExampleAsync 注冊(cè)成功,開始運(yùn)行!\n")
}
// Name: 異步任務(wù)的名稱,需要在進(jìn)程內(nèi)唯一,否則會(huì)被替換
func (a ExampleAsync) Name() string {
return "example"
}
// Handle: 異步任務(wù)的核心邏輯,通過(guò) for 進(jìn)行巡航,通過(guò) context 進(jìn)行安全退出
func (a ExampleAsync) Handle(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
default:
// todo:: Logical unit
time.Sleep(3 * time.Second)
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
case <-ctx.Done():
return
}
}
}
// OnShutdown: 在退出前并行調(diào)用
func (a ExampleAsync) OnShutdown(s os.Signal) {
fmt.Printf("\u001B[1;30;42m[info]\u001B[0m ExampleAsync 接收到系統(tǒng)信號(hào)[%s],準(zhǔn)備退出!\n", s.String())
}
func main() {
// 處理系統(tǒng) SIGINT and SIGTERM 信號(hào).
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
ayc := async.NewAsync(context.Background(), ch)
_ = ayc.Register(ExampleAsync{})
ayc.Wait()
fmt.Println("[1;30;42m[info]\u001B[0m Task exited")
}
評(píng)論
圖片
表情
