文件

快速開始

安裝 go-queue、啟動 worker 池、以可選 preset 入隊任務,並優雅關閉。

前置需求

安裝

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 ./...

下一步

EN