Mix XWP V1.1 - Go 通用動態協程池 WorkerPool
OpenMix 出品:https://openmix.org
Mix XWP
通用動態工作池、協程池
A common worker pool
Github
Installation
go get github.com/mix-go/xwp
單次排程
適合處理資料計算、轉換等場景
先建立一個結構體用來處理任務,使用型別斷言轉換任務資料型別,例如:i := data.(int)
type Foo struct {
}
func (t *Foo) Do(data interface{}) {
// do something
}
排程任務
- 也可以使用
RunF
採用閉包來處理任務 - 如果不想阻塞執行,可以使用
p.Start()
啟動
jobQueue := make(chan interface{}, 200)
p := &xwp.WorkerPool{
JobQueue: jobQueue,
MaxWorkers: 1000,
InitWorkers: 100,
MaxIdleWorkers: 100,
RunI: &Foo{},
}
go func() {
// 投放任務
for i := 0; i < 10000; i++ {
jobQueue <- i
}
// 投放完停止排程
p.Stop()
}()
p.Run() // 阻塞等待
常駐排程
適合處理 MQ 佇列的非同步消費
以 Redis 作為 MQ 為例:
jobQueue := make(chan interface{}, 200)
p := &xwp.WorkerPool{
JobQueue: jobQueue,
MaxWorkers: 1000,
InitWorkers: 100,
MaxIdleWorkers: 100,
RunI: &Foo{},
}
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-ch
p.Stop()
}()
go func() {
for {
res, err := redis.BRPop(context.Background(), 3*time.Second, "foo").Result()
if err != nil {
if strings.Contains(err.Error(), "redis: nil") {
continue
}
fmt.Println(fmt.Sprintf("Redis Error: %s", err))
p.Stop()
return
}
// brPop命令最後一個鍵才是值
jobQueue <- res[1]
}
}()
p.Run() // 阻塞等待
異常處理
Do
方法中執行的程式碼,可能會出現 panic
異常,我們可以通過 recover
獲取異常資訊記錄到日誌或者執行其他處理
func (t *Foo) Do(data interface{}) {
defer func() {
if err := recover(); err != nil {
// handle error
}
}()
// do something
}
執行狀態
Stat()
可以返回 Workers
實時執行狀態,通常可以使用一個定時器,定時列印或者告警處理
go func() {
ticker := time.NewTicker(1000 * time.Millisecond)
for {
<-ticker.C
log.Printf("%+v", p.Stat()) // 2021/04/26 14:32:53 &{Active:5 Idle:95 Total:100}
}
}()
License
Apache License Version 2.0, http://www.apache.org/licenses/
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- ants——Go語言的高效能協程池Go
- Mix PHP V2 例項:協程池非同步郵件傳送守護程式PHP非同步
- golang協程池設計Golang
- 清華尹成帶你實戰GO案例(1) Go 狀態協程Go
- Swoole 協程與 Go 協程的區別Go
- Swoole協程與Go協程的區別Go
- Go 併發 -- 協程Go
- Go實戰準備工作---建立協程池和定時任務Go
- Golang協程池(workpool)實現Golang
- python 協程與go協程的區別PythonGo
- Mix PHP V2 新特性:協程、定時器PHP定時器
- Go程式設計模式三—Fan-Out模式與協程池結合Go程式設計設計模式
- 技術實踐——教你用100行寫一個 go 的協程池 (任務池)!!!Go
- Go中協程死鎖Go
- 理解 Go 中的協程(Goroutine)Go
- go-workerpool 支援每分鐘百萬併發的抽象原型Go抽象原型
- 基於 swoole 協程的 MySQL 連線池MySql
- ants - 目前開源最優的協程池
- 動態SQL——構造通用動態頁面查詢SQL
- Go實戰-基於Go協程和channel的使用Go
- 【深入理解Go】協程設計與排程原理(上)Go
- Go 併發程式設計 - runtime 協程排程(三)Go程式設計
- 【深入理解Go】協程設計與排程原理(下)Go
- 【協程原理】 - 協程不過是使用者態的執行緒執行緒
- Go 多協程記錄執行結果Go
- go 協程初體驗 [模擬使用者執行緒池,處理 50 個任務 jobs]Go執行緒
- [譯] part23: 緩衝channel和協程池
- 動態選路協議協議
- 如何追蹤Go動態Go
- 通用元件:自動更新套件的使用過程元件套件
- Laravel 裡面用swoole的協程go報錯 ?LaravelGo
- go 任務池Go
- Go連線池Go
- 【協程原理】 - cPython的VM真變態Python
- 動態儲存過程儲存過程
- Go語言排程器之主動排程(20)Go
- 動手實現AsyncTask v1.1
- 學習之路 / goroutine 併發協程池設計及實現Go