Celeryd运行多个守护进程

时间:2012-10-23 15:50:56

标签: python django rabbitmq django-celery celeryd

我正在尝试使用Celery与RabbitMQ后端在Fedora上运行异步后台任务,我发现它令人沮丧地不可靠。最大的问题是它偶尔会多次运行相同的任务,而我在诊断原因时遇到了麻烦。

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

我有3台服务器,每台运行celeryd,只有第一台运行的rabbitmq,所有3台服务器共享同一个数据库。我的第一个问题是我的芹菜设置中存在问题,导致每个服务器上的celeryd检索并执行相同的任务。但是,celery docs中的任何内容似乎都没有区分单个主机和多主机设置,所以假设我在settings.py中为每个服务器指定了正确的BROKER_HOST / PORT / USER / PASSWORD / VHOST,它应该“只是”与多个主机合作。这是对的吗?

另一个想法是我可能以某种方式运行芹菜的多个实例,虽然我不知道如何检查这个。两个服务器正在运行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个独立的芹菜实例在运行?如果是这样,这是一个错误,我应该杀死其中的两个吗?

我的第三台服务器正在运行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.*

这是否意味着芹菜没有运行,或者我应该寻找别的东西?

编辑:根据this回答,我认为3个流程可能是默认流程。

1 个答案:

答案 0 :(得分:2)

我在评论中发帖,但我确信这是你的问题,请看这里:

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

你的跑步芹菜三次击败。所以,你发送三次节拍信息。

你应该只有一个打败的实例,或者(最好)自己运行celerybeat并从-芹菜实例中取出-B