关于 golang 任务队列的问题

2023-07-07 14:26:31 +08:00
 AnYi798
大佬们,我刚学 golang ,一直是面向 chatgpt 编程,我想请教一下 golang 有没有开源的任务队列能够直接使用的?

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

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

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

如果是的话用协程不好做。
jorneyr
2023-07-07 18:04:10 +08:00
channel 不就是天生的阻塞任务队列么。
lasuar
2023-07-07 18:14:01 +08:00
直接用 chan 足够,需要持久化用 kafka 或其他 mq
dnsjia
2023-07-07 18:28:45 +08:00
asynq https://www.ziji.work/golang/asynq-go-crontab-tasks.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954859

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX