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

关于 golang 任务队列的问题

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

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

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

    有大佬愿意指点的 可私聊我加个微信,我付费学习。
    15 条回复    2023-07-07 18:28:45 +08:00
    rekulas
        1
    rekulas  
       2023-07-07 14:30:12 +08:00
    主任务判断不一定非要依赖队列库,可以自己封装实现,就比较灵活了,随便找个队列工具都可以用
    AnYi798
        2
    AnYi798  
    OP
       2023-07-07 14:33:30 +08:00
    @rekulas redis 和 rabbitmq 都用了,主要感觉自己写判断逻辑太麻烦了,我一个小白写着写着就晕了,还是想找个成熟一点的直接用
    GeorgeWai
        3
    GeorgeWai  
       2023-07-07 14:33:43 +08:00
    基于 golang 的协程+chan 自己造个吧,基于 gpt4.0 ,问题不大,只要 prompt 方向对。
    AnYi798
        4
    AnYi798  
    OP
       2023-07-07 14:37:20 +08:00
    @GeorgeWai 太难为我了 哈哈哈 而且自己写的 bug 可能会很多
    hahasong
        5
    hahasong  
       2023-07-07 14:40:19 +08:00
    context + chan 自己就撸了 要开多少个协程就看你硬件配置了
    Nazz
        6
    Nazz  
       2023-07-07 14:41:31 +08:00
    来个 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  
       2023-07-07 14:45:17 +08:00
    777777
        8
    777777  
       2023-07-07 14:47:14 +08:00
    分布式可以用上面两个,单体就用原始 chan
    AnYi798
        9
    AnYi798  
    OP
       2023-07-07 14:47:25 +08:00
    @777777 asynq 我用了 但是感觉不太符合我的要求 总感觉有问题 但是又不知道哪里有问题 。。。。。。。。。。。。。。。。。。 不是我想要的那种任务队列
    Nazz
        10
    Nazz  
       2023-07-07 14:49:06 +08:00
    看看这个, 无 channel 实现的任务队列, 搭配 WaitGroup 使用就符合你的需求了
    https://github.com/lxzan/gws/blob/master/task.go
    AnYi798
        11
    AnYi798  
    OP
       2023-07-07 15:06:23 +08:00
    @Nazz 可以可以 我看看能不能用
    flyqie
        12
    flyqie  
       2023-07-07 16:07:27 +08:00
    你说的任务层级是需要干净 cancel 的吗?

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