OpenMix 出品:https://openmix.org
Mix XWP
通用的工作池
A common worker pool
Github
Installation
go get github.com/mix-go/xwp
Usage
先創(chuàng)建一個(gè)結(jié)構(gòu)體用來(lái)處理任務(wù),使用類型斷言轉(zhuǎn)換任務(wù)數(shù)據(jù)類型,例如:i := data.(int)
type Foo struct {
}
func (t *Foo) Do(data interface{}) {
// do something
}
調(diào)度任務(wù)
- 也可以使用
RunF
采用閉包來(lái)處理任務(wù) - 如果不想阻塞執(zhí)行,可以使用
p.Start()
啟動(dòng)
jobQueue := make(chan interface{}, 200)
p := &xwp.WorkerPool{
JobQueue: jobQueue,
MaxWorkers: 1000,
InitWorkers: 100,
MaxIdleWorkers: 100,
RunI: &Foo{},
}
go func() {
// 投放任務(wù)
for i := 0; i < 10000; i++ {
jobQueue <- i
}
// 投放完停止調(diào)度
p.Stop()
}()
p.Run() // 阻塞等待
異常處理:Do
方法中執(zhí)行的代碼,可能會(huì)出現(xiàn) panic
異常,我們可以通過(guò) recover
獲取異常信息記錄到日志或者執(zhí)行其他處理
func (t *Foo) Do(data interface{}) {
defer func() {
if err := recover(); err != nil {
// handle error
}
}()
// do something
}
查看 Workers
的執(zhí)行狀態(tài):通常可以使用一個(gè)定時(shí)器,定時(shí)打印或者告警處理
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/