• 请不要在回答技术问题时复制粘贴 AI 生成的内容
AnYi798
V2EX  ›  程序员

关于 golang 任务队列的问题

  •  
  •   AnYi798 · Jul 7, 2023 · 2406 views
    This topic created in 1065 days ago, the information mentioned may be changed or developed.
    大佬们,我刚学 golang ,一直是面向 chatgpt 编程,我想请教一下 golang 有没有开源的任务队列能够直接使用的?

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

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

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

    如果是的话用协程不好做。
    jorneyr
        13
    jorneyr  
       Jul 7, 2023
    channel 不就是天生的阻塞任务队列么。
    freemoon
        14
    freemoon  
       Jul 7, 2023
    直接用 chan 足够,需要持久化用 kafka 或其他 mq
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   861 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 20:25 · PVG 04:25 · LAX 13:25 · JFK 16:25
    ♥ Do have faith in what you're doing.