芹菜的任务几乎立刻就会被卡住了#34;使用Celery Beat和倒计时时使用.apply_async()

时间:2014-06-11 00:20:37

标签: python django redis task celery

这是my Celery "tasks" filemy 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

0 个答案:

没有答案