python - Celeryd 运行多个守护进程

标签 python django rabbitmq django-celery celeryd

我正在尝试使用Celery使用 RabbitMQ 后端在 Fedora 上运行异步后台任务,但我发现它非常不可靠。最大的问题是它偶尔会多次运行相同的任务,而我无法诊断原因。

我不认为我的代码多次触发该任务,因为我已经通过手动启动该任务(创建数据库记录)一次进行了测试,并看到创建了两个相同的记录。如果我从 Django shell 运行代码,只会创建一条记录,因此问题肯定是 Celery 造成的。

我有3台服务器,每台都运行celeryd,只有第一个运行rabbitmq,并且所有3台服务器共享相同的数据库。我的第一次经历是我的 celery 设置存在问题,导致每台服务器上的 celeryd 检索并执行相同的任务。然而,celery 文档中似乎没有区分单主机和多主机设置,因此假设我在每个服务器的 settings.py 中指定了正确的 BROKER_HOST/PORT/USER/PASSWORD/VHOST ,它应该“只是与多个主机一起工作”。这是正确的吗?

我的另一个想法是我可能以某种方式运行 celeryd 的多个实例,尽管我不确定如何检查这一点。两台服务器正在运行 Fedora 13,当我运行 ps aux | grep .*.py 时我得到:

root     24806  0.1  1.8  51404 31328 ?        Sl   Oct19   9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24900  0.1  1.6  51404 28592 ?        S    Oct19   6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24901  0.3  9.4 183232 161948 ?       S    Oct19  22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler

这是否表明 3 个独立的 celeryd 实例正在运行?如果是这样,这是一个错误吗?我应该杀死其中 2 个吗?

我的第三台服务器运行的是 Fedora 17,它具有不同的服务框架。当我运行systemctl status celeryd.service时我得到:

celeryd.service - LSB: celery task worker daemon
      Loaded: loaded (/etc/rc.d/init.d/celeryd)
      Active: active (exited) since Fri, 19 Oct 2012 10:59:38 -0400; 4 days ago
     Process: 732 ExecStop=/etc/rc.d/init.d/celeryd stop (code=exited, status=0/SUCCESS)
     Process: 738 ExecStart=/etc/rc.d/init.d/celeryd start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/celeryd.service

我不知道如何解释这一点。 “事件”通常意味着它正在运行,但“退出”通常意味着它没有运行。当我运行ps aux | grep .*celery.*时我只得到:

root     25142  0.0  0.0 109400   932 pts/0    S+   11:28   0:00 grep --color=auto .*celery.*

这是否意味着 celeryd 没有运行,或者我应该寻找其他东西?

编辑:基于this答,我认为这3个进程可能是默认的。

最佳答案

我在评论中发布了,但我确信这是您的问题,请参见此处:

root     24806  0.1  1.8  51404 31328 ?        Sl   Oct19   9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24900  0.1  1.6  51404 28592 ?        S    Oct19   6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24901  0.3  9.4 183232 161948 ?       S    Oct19  22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler

你的运行 celeryd 节拍三遍。因此,您发送的消息重复了三遍。

您应该只打开一个实例,或者(最好)单独运行 celerybeat 并从 celeryd 实例中去掉 -B

关于python - Celeryd 运行多个守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13034419/

相关文章:

spring - Jackson 配置以使用rabbitmq 中的记录列表

rabbitmq - Celery(Django)限速

python - 具有对角矩阵的点积,无需创建完整矩阵

python - KeyboardInterrupt 后关闭并重置 Tornado IOLoop

python - 用于存储排序字段以有效允许修改的数据结构

Django 和 Celery - 更改后将代码重新加载到 Celery 中

python - 防止上传大小超过某个限制的文件

python - 从内存中的 url 下载图像并在内存中创建 zip 存档以发送到浏览器

python - Django 两个来自同一模型的外键

macos - 在 Mac OS X el Capitan 上,rabbitmq-server 启动失败