Celery不会记录返回值或在重新启动之前获取新任务

时间:2014-02-25 20:12:18

标签: python django celery django-celery

Celery突然开始对我们采取行动并停止了任务。

的信息:

  • 我们正在使用芹菜3.0.10
  • 我们正在使用django-celery 3.0.10
  • 我们正在使用RabbitMQ。

问题:

Celery在重新启动任务之前不记录任务的输出(loglevel INFO)。这可以,但是在重新启动之前它不会获取新任务。不,任务没有死锁,我在返回打印到日志的布尔值之前有一个打印。

示例:

@task()
def my_task(username):
     print "Start"
     result = api_call(username)
     print "Finished", result
     return result

在日志中我们看到:

[2014-02-25 20:45:28,300: INFO/MainProcess] Got task from broker: my_project.my_app.my_task[475ff845-6a63-4b7b-9e02-4ce198043707]
[2014-02-25 20:45:29,667: WARNING/Worker-X] Start
[2014-02-25 20:45:29,667: WARNING/Worker-X] Finished, True

然后什么都没有。直到我重新启动:

[2014-02-25 21:08:15,081: INFO/MainProcess] Task my_project.my_app.my_task[475ff845-6a63-4b7b-9e02-4ce198043707] succeeded in 1392992732.81s: True
...

这三个点表示从经纪人等处获得任务的下一次迭代。不管我们有多少工人,它们都是一样的,他们只会用并发来做。

任何想法为什么?

修改

在调查了更多之后,我意识到每个工作人员在锁定之前只完成了四个任务,并且在返回之前获得了每个工作人员的打印,因此没有任何任务实际上被锁定。重启后记录所有四个任务返回,并查看Rabbit队列中有待处理的任务。这就像每个工作者只能在内存中保存四个任务结果并且永远不会刷新它,直到芹菜重新启动,然后刷新它们并获取一个新的。但都处理得当。

1 个答案:

答案 0 :(得分:1)

事实证明,我的Celery版本以及我可以访问的Kombu版本是个时髦的东西。它不适用于目前在回购中的任何版本的Kombu(需要旧版本),因此升级芹菜和kombu有效。