这是my Celery "tasks" file和my Django project's settings.py,它具有此Celery Beat配置(timedelta在用户可编辑的配置文件中设置为每3秒一次):
CELERYBEAT_SCHEDULE = {
"UpdateEnabledSensors": {
"task": "pidrator.hardware_controller.UpdateEnabledSensors",
"schedule": timedelta(seconds=PIDRATOR_SENSOR_UPDATE_FREQUENCY)
}
}
通过celery -A pidrator -B -l info
启动Celery工作人员时,我得到this output。
正如你所看到的,这些任务有点开始,好吧,慢慢消失。首先,ActuateRelay停止响应请求,然后是WateringCycle,然后是UpdateSensor等。更奇怪的是,没有通过Celery报告错误。
我认为问题出现在WateringCycle
任务中,如下所示:
@celery_pidrator.task
def WateringCycle(irrigator):
from celery import chain
chain(
SetWateringCycle.si(irrigator, True),
ActuateRelay.si(irrigator.relay, True),
ActuateRelay.subtask(
(irrigator.relay, False),
countdown=irrigator.watering_seconds,
immutable=True),
SetWateringCycle.subtask(
(irrigator, False),
countdown=irrigator.timeout_seconds,
immutable=True)
).apply_async()
当我将其内容注释掉并将logger.warning("test")
放入其中时,芹菜任务似乎已完成,队列不会“卡住”。我不认为这是因为链,因为如果我用以下内容替换任务的内容:
@celery_pidrator.task
def WateringCycle(irrigator):
SetWateringCycle(irrigator, True)
ActuateRelay(irrigator.relay, True)
ActuateRelay.apply_async(
(irrigator.relay, False),
countdown=irrigator.watering_seconds)
SetWateringCycle.apply_async(
(irrigator, False),
countdown=irrigator.watering_seconds + irrigator.timeout_seconds)
......它仍然“陷入困境”。我真的不明白任务队列和工作人员如何在外面工作,他们生活在游泳池和处理任务中,但有些东西告诉我倒计时的任务是“填满队列”(原谅我在语义上的无知)。但是,如果我将--autoscale=50,1
添加到芹菜中,当它被“卡住”时(我真的希望我有一个更好的术语),芹菜工人只会累积,直到所有50名工人都在,并且它仍然没有处理任何任务。
我正在使用Python 3,Redis和mysql.connector与Celery。我尝试过使用RabbitMQ,甚至将整个项目移植到Python 2.x以使用librabbitmq,但它的行为方式仍然相同。以下是一些软件包版本,如果它有帮助:
python 3.4.1-1
python-celery 3.1.12-1
python2-kombu 3.0.19-1
python-billiard 3.3.0.17-1
python-django 1.6.5-1
python-redis 2.10.1-1
redis 2.8.10-1
python-mysql-connector 1.2.2-1