需求:
1.在客户端使用 celery 的时候,将 celery 的任务使用 redis.lpush 存储到 redis 中(比如发送短信或者邮箱)
2.自己封装一个 celery 服务,将该 celery 服务跑在一个端口,使用 redis 的 rpop 实时监控是否有任务存在,如果有则处理
不知道我描述的够不够清楚,我现在不知道这个轮子应该怎么写,大家有没有之后的 demo 可以借鉴下啊
1
SingeeKing 2019-08-06 10:21:28 +08:00
你是不是对 Celery 有误解…… 它本身就可以自动监控是否有任务并处理,而且也可以用 Redis 做消息队列啊
|
2
37Y37 2019-08-06 10:25:08 +08:00
celery 本身就是个异步处理框架,都帮你做好了,你只需要用就行了,不用关心 redis 队列,使用可参考:
https://ops-coffee.cn/s/lXrp3igYo9W2UuE5Gauysg |
3
kayseen OP @SingeeKing 我知道你的意思,但是现在需求就是写一个通用的 celery 服务,就是你在项目中使用到 celery 的时候,只往 redis 中存任务,你封装的 celery 就是时刻监控 redis 中的任务...通俗点把 celery 单独提出来写个服务
|
4
leishi1313 2019-08-06 10:29:38 +08:00
还是跟其他几楼一样,celery 本来就是这么用的啊。或者针对 redis,有其他的轮子也可以用:python-rq.org 。
|
5
SingeeKing 2019-08-06 10:42:18 +08:00
意义何在啊,你这本身就是重复造了个 Celery 啊
你可以理解为 Celery 是一个消息队列的处理器、Redis 是一个消息队列; Celery 本身的作用就是「将任务存到 Redis 中」和「实时监控是否有任务存在,如果有则处理」,所以你现在的需求就是自己造一个 Celery 那么。。回复你的问题:Celery 就是你要的 demo |
6
est 2019-08-06 10:43:45 +08:00
额。。。。。
|
7
youngce 2019-08-06 11:07:10 +08:00
你的问题,就好比现在你已经有一个轮子了,你只看到了轮胎,想着自己还要做个轮毂,殊不知人家轮胎里,已经包好了一个豪华轮毂了
|
8
AllenBigBear 2019-08-06 11:10:07 +08:00
@37Y37 我也关注了你的公众号,有些问题想借楼问一下,我最近在部署 django 2.0,配合 supervisor,celery 4,gunicorn 和 redis
部署的服务器是 1C1G5M 的良心云 然后我如果 supervisor 里面单独启动 gunicorn (也就是只运行 django ),加载速度没问题 但是如果我一并启动了 celery,服务器就一下子超卡。。 不知道有没有碰到过类似的问题?谢谢! |
9
est 2019-08-06 11:13:54 +08:00
@youngce celery 本身就是轮子套轮子。。比如 RabbitMQ 这个其实本身功能就够强大了。celery 自作聪明套了一层。。
|
10
arrow8899 2019-08-06 11:15:12 +08:00
django 开放一个 API 出来就行了,导入 django-celery 模块,调用这个 API 就可以往 celery 里写入任务,没必要再去加一层 redis。
|
11
youngce 2019-08-06 11:18:38 +08:00
@est 还行吧,毕竟 celery 也是支持用 redis 作为消息队列的,当初我对 RabbitMQ 不怎么了解的时候,项目里已经有了 redis,就直接 celery+redis 一把梭了。现在看起来的话,确实还有有很多可以改进的地方- -
|
12
lolizeppelin 2019-08-06 11:25:34 +08:00
请使用 oslo.messaging
|
13
smallpython 2019-08-06 11:28:48 +08:00
楼上并没有在解决问题啊
我的理解 你说的客户端发送任务,服务器接收任务 其实就是客户端把任务放到消息队列里,那么你的服务端就不需要开什么服务端口 只需要 redis 端口开放出来就可以了 想要实现这个功能只需要客户端和服务器的任务名称一样,指定的消息队列一样,剩下的 celery 会自动调度任务 |
14
wd 2019-08-06 13:21:33 +08:00 via iPhone
@kayseen #3 celery 是可以独立运作的 看你说的是想自己往 broker 发消息应该也是可以的 可能需要你自己去看看实现的逻辑
|
15
c9106 2019-08-07 08:31:05 +08:00
朋友,celery flower 已经有 api 在那里了,只是简单了点,可以自己扩展
|
16
fansfans 2019-08-08 17:39:16 +08:00
@smallpython 跟我想说的差不多,但是需要在客户端创建同样的任务名称 然后调用,虽然这个任务不需要实现,但是感觉还是会很鸡肋 。如果模拟 TaskProducer.publish_task 的实现 应该可以达到发送函数名执行的效果
|