我正在尝试使用带有 RabbitMQ 后端的Celery在 Fedora 上运行异步后台任务,但我发现它令人沮丧地不可靠。最大的问题是它偶尔会多次运行相同的任务,我无法诊断原因。
我认为我的代码不会多次触发任务,因为我已经通过手动启动任务(创建数据库记录)一次进行了测试,并看到创建了两个相同的记录。如果我从 Django shell 运行代码,只会创建一条记录,所以问题肯定是 Celery。
我有 3 台服务器,每台运行 celeryd,只有第一个运行 rabbitmq,所有 3 台服务器共享同一个数据库。我的第一个问题是我的 celery 设置存在问题,导致每台服务器上的 celeryd 检索并执行相同的任务。但是,芹菜文档中似乎没有任何东西可以区分单主机和多主机设置,因此假设我在我的 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 没有运行,还是我应该寻找其他东西?
编辑:基于这个答案,我认为这 3 个进程可能是默认的。