V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AnYi798
V2EX  ›  程序员

关于 golang 任务队列的问题

  •  
  •   AnYi798 · 295 天前 · 1458 次点击
    这是一个创建于 295 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大佬们,我刚学 golang ,一直是面向 chatgpt 编程,我想请教一下 golang 有没有开源的任务队列能够直接使用的?

    目前在写一个项目,需要下发很多任务到队列,然后每个任务都有对应的子任务需要跑,子任务全部完成后主任务才算完成,搜了很多资料都没有发现符合我要求的任务队列工具,或者说有没有跟 python 的 celery 一样的工具也行?

    怀疑自己思路错了,希望大佬们指点一二,目前还没有思路。

    有大佬愿意指点的 可私聊我加个微信,我付费学习。
    15 条回复    2023-07-07 18:28:45 +08:00
    rekulas
        1
    rekulas  
       295 天前
    主任务判断不一定非要依赖队列库,可以自己封装实现,就比较灵活了,随便找个队列工具都可以用
    AnYi798
        2
    AnYi798  
    OP
       295 天前
    @rekulas redis 和 rabbitmq 都用了,主要感觉自己写判断逻辑太麻烦了,我一个小白写着写着就晕了,还是想找个成熟一点的直接用
    GeorgeWai
        3
    GeorgeWai  
       295 天前
    基于 golang 的协程+chan 自己造个吧,基于 gpt4.0 ,问题不大,只要 prompt 方向对。
    AnYi798
        4
    AnYi798  
    OP
       295 天前
    @GeorgeWai 太难为我了 哈哈哈 而且自己写的 bug 可能会很多
    hahasong
        5
    hahasong  
       295 天前
    context + chan 自己就撸了 要开多少个协程就看你硬件配置了
    Nazz
        6
    Nazz  
       295 天前
    来个 star 吧, 泛型实现的任务队列

    https://github.com/lxzan/concurrency

    ```go
    package main

    import (
    "fmt"
    "github.com/lxzan/concurrency"
    "sync/atomic"
    )

    func main() {
    sum := int64(0)
    w := concurrency.NewWorkerGroup[int64]()
    for i := int64(1); i <= 10; i++ {
    w.Push(i)
    }
    w.OnMessage = func(args int64) error {
    fmt.Printf("%v ", args)
    atomic.AddInt64(&sum, args)
    return nil
    }
    w.Start()
    fmt.Printf("sum=%d\n", sum)
    }
    ```

    输出
    ```
    4 5 6 7 8 9 10 1 3 2 sum=55
    ```
    777777
        7
    777777  
       295 天前
    777777
        8
    777777  
       295 天前
    分布式可以用上面两个,单体就用原始 chan
    AnYi798
        9
    AnYi798  
    OP
       295 天前
    @777777 asynq 我用了 但是感觉不太符合我的要求 总感觉有问题 但是又不知道哪里有问题 。。。。。。。。。。。。。。。。。。 不是我想要的那种任务队列
    Nazz
        10
    Nazz  
       295 天前
    看看这个, 无 channel 实现的任务队列, 搭配 WaitGroup 使用就符合你的需求了
    https://github.com/lxzan/gws/blob/master/task.go
    AnYi798
        11
    AnYi798  
    OP
       295 天前
    @Nazz 可以可以 我看看能不能用
    flyqie
        12
    flyqie  
       295 天前
    你说的任务层级是需要干净 cancel 的吗?

    如果是的话用协程不好做。
    jorneyr
        13
    jorneyr  
       295 天前
    channel 不就是天生的阻塞任务队列么。
    lasuar
        14
    lasuar  
       295 天前
    直接用 chan 足够,需要持久化用 kafka 或其他 mq
    dnsjia
        15
    dnsjia  
       295 天前
    asynq https://www.ziji.work/golang/asynq-go-crontab-tasks.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   891 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:01 · PVG 05:01 · LAX 14:01 · JFK 17:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.