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



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

信息:

  • 我们用的是芹菜3.0.10
  • 我们用的是姜果芹菜3.0.10
  • 我们正在使用RabbitMQ

问题:

Celery在重新启动之前不会记录任务的输出(日志级别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
...

其中三个点表示从broker等获得任务的下一次迭代。无论我们有多少工作人员,他们都是一样的,只是使用并发性。

有什么想法吗?

编辑:

经过更多的调查,我意识到每个工人在锁定之前只执行四项任务,而我在每个工人返回之前都会打印出来,所以实际上没有一项任务被锁定。所有四个任务返回都会在重新启动后记录下来,并且在Rabbit队列中可以看到要处理的任务。这就像每个工作人员在内存中只能保存四个任务结果,并且从不刷新它,直到芹菜重新启动,然后刷新它并获取新的结果。但所有这些都经过了适当的处理。

事实证明,我的Celery版本和我可以访问的Kombu版本发生了一些奇怪的事情。它不适用于目前回购中的任何Kombu版本(需要一个旧版本),因此升级芹菜和Kombu有效。

相关内容

  • 没有找到相关文章

最新更新