Mix XWP V1.1 - Go 通用動態協程池 WorkerPool

onanying發表於2021-04-26

OpenMix 出品:https://openmix.org

Mix XWP

通用的工作池

A common worker pool

Github

https://github.com/mix-go/xwp

Installation

go get github.com/mix-go/xwp

Usage

先建立一個結構體用來處理任務,使用型別斷言轉換任務資料型別,例如: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() // 阻塞等待

異常處理:Do 方法中執行的程式碼,可能會出現 panic 異常,我們可以通過 recover 獲取異常資訊記錄到日誌或者執行其他處理

func (t *Foo) Do(data interface{}) {
    defer func() {
        if err := recover(); err != nil {
            // handle error
        }
    }()
    // do something
}

檢視 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/

更多原創文章乾貨分享,請關注公眾號
  • Mix XWP V1.1 - Go 通用動態協程池 WorkerPool
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章