快速開始
安裝 go-queue、啟動 worker 池、以可選 preset 入隊任務,並優雅關閉。
前置需求
- Go 1.23 或更高版本
安裝
go get github.com/pardnchiu/go-queue
公開 API 的 import 路徑:
import goQueue "github.com/pardnchiu/go-queue/core"
基礎用法
package main
import (
"context"
"fmt"
"log"
"time"
goQueue "github.com/pardnchiu/go-queue/core"
)
func main() {
q := goQueue.New(&goQueue.Config{
Workers: 4,
})
ctx := context.Background()
if err := q.Start(ctx); err != nil {
log.Fatal(err)
}
defer func() {
if err := q.Shutdown(context.Background()); err != nil {
log.Printf("shutdown: %v", err)
}
}()
id, err := q.Enqueue(ctx, "", func(ctx context.Context) error {
fmt.Println("task running")
return nil
})
if err != nil {
log.Fatal(err)
}
fmt.Println("enqueued:", id)
time.Sleep(100 * time.Millisecond)
}
優先級預設
具名 preset 將入隊名稱對應到優先級與可選逾時覆寫。
q := goQueue.New(&goQueue.Config{
Workers: 2,
Timeout: 30 * time.Second,
Preset: map[string]goQueue.PresetConfig{
"urgent": {Priority: goQueue.PriorityImmediate},
"batch": {Priority: goQueue.PriorityLow, Timeout: 60 * time.Second},
},
})
_ = q.Start(ctx)
_, _ = q.Enqueue(ctx, "urgent", func(ctx context.Context) error {
// 高優先工作
return nil
})
_, _ = q.Enqueue(ctx, "batch", func(ctx context.Context) error {
// 低優先工作
return nil
})
入隊選項
id, err := q.Enqueue(ctx, "urgent", func(ctx context.Context) error {
// 業務邏輯
return nil
},
goQueue.WithTaskID("order-123"),
goQueue.WithTimeout(10*time.Second),
goQueue.WithRetry(2),
goQueue.WithCallback(func(id string) {
fmt.Println("done:", id)
}),
)
if err != nil {
log.Fatal(err)
}
| 選項 | 用途 |
|---|---|
WithTaskID |
自訂 task ID;省略則自動產生 UUID |
WithTimeout |
覆寫本次任務逾時 |
WithRetry |
啟用重試;省略參數時預設最多 3 次 |
WithCallback |
成功完成後非同步回呼 |
優雅關閉
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := q.Shutdown(shutdownCtx); err != nil {
// 逾時:仍有任務未完成
log.Printf("shutdown: %v", err)
}
Shutdown 可重複呼叫(冪等)。ctx 逾時時回傳剩餘待處理任務數。
從原始碼
git clone https://github.com/pardnchiu/go-queue.git
cd go-queue
go test ./...