当达到并发值时,Celery检查显示工作线程脱机

时间:2014-08-01 21:42:52

标签: django rabbitmq celery

我们的项目使用Django运行一个Web服务器,Celery / RabbitMQ向工作人员发送任务。每当一个工人处于完成任务的能力时(例如,并发四个人有四个任务),他们就会停止从花朵或内置的芹菜检查中出现。

ETA:工作人员仍然在线,当任务完成以致工作人员低于并发价值时,它再次出现在花中并进行检查。不幸的是,我试图使用'保留'检查排队任务的方法,每当我看到工人时,这总是空的。

以下是Django设置文件中的Celery设置:

BROKER_URL = 'amqp://[user]:[pw]@[host]//'

CELERY_ACCEPT_CONTENT = ['json']
CELERY_EVENT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'amqp'
CELERY_TIMEZONE = 'US/Mountain'
CELERY_RESULT_PERSISTENT = True
CELERY_TASK_RESULT_EXPIRES = 3600 # seconds
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_DEFAULT_QUEUE = 'tasks'
CELERY_TRACK_STARTED = True

from kombu import Queue

CELERY_QUEUES = (Queue('tasks', routing_key='task.#'),
                 Queue('frontend_tasks', routing_key='frontend.#'),
                )

CELERY_DEFAULT_ROUTING_KEY = 'task.default'
CELERY_DEFAULT_EXCHANGE = 'tasks'

芹菜版:3.1.13

RabbitMQ版本:3.3.4-1

kombu版本:3.0.21

amqp版本:1.4.5

调用芹菜工人:

python manage.py celery worker -f c:\logs\celery.log -E -l info --settings=[proj].settings.production

更新: 将预取乘数设置为1后,即使有四个任务,我仍然可以看到工作人员。但是,我无法在worker上看到任何挂起的任务,因为它们尚未从服务器中获取。有没有人知道我是否有办法让工人(出现)在线并仍然可以看到队列中待处理的任务?将预取乘数设置为2会使工作人员在有四个或更多任务时从检查/开花中掉线。即使将预取乘数设置为2并且将并发性设置为1或2(从4开始)也会导致相同的消失工作者"问题。

提前感谢您的帮助,

史蒂夫

1 个答案:

答案 0 :(得分:2)

我找到了解决此问题的解决方案。通过向调用提交-P threads参数,我将我的工作者更改为线程而不是prefork:

python manage.py celery worker -f c:\logs\celery.log -E -P threads -l info --settings=[proj].settings.production

然后我能够正确地检查工作人员,即使他们以并发价值运行。我确实必须确保我的所有任务都是线程安全的(shutil是主要的攻击者,并且修复了一个简单的锁)。

我希望这会有所帮助。

史蒂夫