菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
95
0

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

原创
05/13 14:22
阅读数 424

因为最近要做一个简单的并发任务系统,在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 也不是非常熟悉。

发表评论

0/200
95 点赞
0 评论
收藏
为你推荐 换一批