多个 django app 使用 celery 问题

2015-11-26 11:07:05 +08:00
 lixia625
采用 /etc/init.d/celeryd 方式启动的守护进程
查了下文档 celeryd 貌似只能对应设置一个 app ?这样的话只有这一个 app 的 task 能被成功执行
如何让多个 app 同时拥有各自不同的 celery 守护进程?
4761 次点击
所在节点    Django
13 条回复
neoblackcap
2015-11-26 11:21:02 +08:00
那,你为什么不试试自己用 supervisor 去管理你的 celery 守护进程啊。我没试过系统自带的。 supervisor 倒是可以配置多个守护进程。

同时为什么要隔离呢?不是只要 worker 能执行就好了吗?按道理你只要将你的 task 注册了就好了
lixia625
2015-11-26 11:25:29 +08:00
@neoblackcap 我也是这么想的,但目前只有一个 app 的 task 能被执行,是我 celeryd 的姿势不对么?
neoblackcap
2015-11-26 11:37:47 +08:00
@lixia625 我觉得是你的 celery 配置没设置好,你的 task 没有注册,你倒是发一下 log 啊
lixia625
2015-11-26 11:47:01 +08:00
@neoblackcap

# Names of nodes to start
# most will only start one node
CELERY_NODES="worker"
# but you can also start multiple and configure settings
# for each in CELERYD_OPTS (see 'celery multi --help' for example)
#CELERY_NODES="worker1 worker2 worker3"

# Absolute or relative path to the 'celery' command
CELERY_BIN="/usr/local/bin/celery"
# CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="app1"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# Where to chdir at start
CELERYD_CHDIR="/var/www/app1/"

# Extra command-line arguments to the worker
CELERY_OPTS="--time-limit=1800 --concurrency=8"

# %N will be replaced with the first pat of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"

...


这样的话 app1 是完全正常的,但也只有 /var/www/app1/的任务被执行, log 里也只有 app1 的 log 啊
我现在的问题就是我还有一个 /var/www/app2/我该怎么弄 T_T
neoblackcap
2015-11-26 12:01:32 +08:00
你这个配置文档是在哪里的?/etc/celeryd?
你用 django 的,我真的建议你用 supervisor 去一起管理你的应用,具体请参考[document]( http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html?highlight=celery_app)
neoblackcap
2015-11-26 12:03:12 +08:00
@lixia625 你只注册 app1 那肯定只会跑 app1 啊,还有就是你用什么版本的 celery 啊?
xunyu
2015-11-26 12:25:08 +08:00
settings.py 里面加上
CELERY_IMPORTS = ('xxxx',
'xxxx')
然后执行 worker 就可以了
julyclyde
2015-11-26 13:37:15 +08:00
不要总是建议别人怎么办
还要说出这种建议的理由

上面几位我觉得自己可能都不懂 celery 的配置吧
lixia625
2015-11-26 16:49:57 +08:00
@neoblackcap
@xunyu
@julyclyde


在 /etc/init.d/celeryd 中,发现这样一段话

# To implement separate init scripts, copy this script and give it a different
# name:
# I.e., if my new application, "little-worker" needs an init, I
# should just use:
#
# cp /etc/init.d/celeryd /etc/init.d/little-worker
#
# You can then configure this by manipulating /etc/default/little-worker.
#

于是我照着做了,创建了另一个脚本,启动进程,然后两个网站的任务都能被接收到并执行了。
另外我也试了用 supervisor ,也达到了同样的效果。

然而。。。

事情是这样的,这实际上是两个相同的网站,只不过连了不同的数据库,所以在我以为搞定了的时候,发现两者的任务混在了一起,也就是 app1 中触发的任务,一会儿改动的是 app1 连的数据库,一会儿改动的是 app2 连的数据库

这又是什么情况,用的是 rabbitmq ,看现象大概是它无法区分两个 app 发来的任务?
正确的做法应该是什么? route ? queue ?还是多个 rabbitmq host ?
julyclyde
2015-11-26 17:38:27 +08:00
You can then configure this by manipulating /etc/default/little-worker 这一步做了吗?
julyclyde
2015-11-26 17:38:50 +08:00
不同任务应该用不同的队列吧。你在 rabbitmq 里新增一个 queue 呗
neoblackcap
2015-11-26 18:04:12 +08:00
@julyclyde
队列不是因为这样才分,是看你要不要优先处理你的特定任务。比如 task1 的处理不应堵塞 task2 那么就应该采用不同队列而且分配不同的 worker 去处理

@lixia625
你 task 里面的 settings 读错了,还是用同样的参数,那肯定是连到同样的数据库里面。
111111111111
2016-01-13 12:07:17 +08:00
@neoblackcap
老司机,请教一下
不同应用是可以使用同一个队列的的吗?
那么各应用在更新了代码之后,怎么用重启 celery 呢?
生产环境怎么安排比较好呢




@lixia625
lz 问题搞定了吗?最近遇到同样问题

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

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

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

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

© 2021 V2EX