基于内存和文件存储的 queue worker, 不用 Redis 适合单进程使用没有外部依赖

因为最近要做一个简单的并发任务系统,在github 上面找了一圈并没有简单可依赖的库,所以自己写了一个。欢迎大家 Review 贡献代码。

项目地址

https://github.com/iflamed/mfworker

功能介绍

  1. 使用 channel 以及 goroutine 做任务分发;
  2. 不依赖外部系统,一般做队列或者任务的可能都会依赖redis或者其它系统;
  3. 可以指定worker 数量;
  4. 可以限制内存中缓存job的数量,内存充裕的时候可以提高分发性能;
  5. job 数量堆积超出内存job数量限制的时候,自动写入基于badger 的db文件;
  6. 可以对接外部日志系统;
  7. 重启继续执行上次未执行完成的 job;
  8. 支持queue worker 优雅结束;

Demo

package main

import (
    "log"
    "strconv"
    "time"
    "github.com/iflamed/mfworker"
)

func main()  {
    var (
        count    uint
        maxItems uint
    )
    count = 4
    maxItems = 16
    path := "./test.db"
    logger := nil
    q := mfworker.NewQueue(count, maxItems, path, nil)
    q.Handler("Test", func(job *mfworker.Job) {
        time.Sleep(time.Second)
        log.Printf("the job name %s, job body %s ", job.Name, job.Payload)
    })
    q.Start()
    go func() {
        for i := 0; i < 64; i++ {
            job := &mfworker.Job{
                Name:    "Test",
                Payload: []byte("body " + strconv.Itoa(i)),
            }
            q.Dispatch(job)
        }
    }()
    <-time.After(10 * time.Second)
    q.Stop()
}

具体使用代码可以参考 queue_test.go
最后,欢迎使用或者Review 代码,毕竟我对Golang 也不是非常熟悉。

newbing
讨论数量: 2

:+1:
可否有个操作文档啥的?

4年前 评论
newbing

@xingxiaoli 应该看测试代码就明白了。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!