首页 > 解决方案 > 如何将任务结果从 Celery 客户端代码存储到数据库?

问题描述

我正在尝试掌握 Celery 的窍门。到目前为止,一切看起来都很好。我只是无法弄清楚一件事:

我希望存储在数据库中的任务结果不仅可以从工作人员更新状态,还可以在将消息发送到代理时从客户端应用程序更新状态。

所以目前我的配置中有以下两行:

CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_TRACK_STARTED = True

这会更新数据库中由工作人员管理的任务的所有状态,包括STARTED状态。

但我想要的是也有由于客户端的状态,比如PENDING. 因此,PENDING只要工作人员没有获得该任务,DB 中的结果就会开始,然后当工作人员开始/获得该任务时,诸如 等状态STARTEDSUCCESS更新到数据库。

背后的基本原理是我们希望我们的数据库包含所有任务的记录,即使它们仍处于待处理状态(即尚未被任何工作人员选中)。

我的问题是:

  1. 可能吗?因为这种方式数据库中的任务行必须由客户端代码创建,然后工作人员在更新任务状态时必须识别正确的任务。如果不是通过任何 Celery 配置,那么可能是通过编写自定义代码?

  2. 我遇到了CELERY_SEND_TASK_SENT_EVENT = True它使 Celery 客户端能够发送事件,从而允许Flower显示PENDING任务。我的猜测是,如果Flower可以从客户端代码中获取这些事件,然后从工作人员的事件中更新正确的状态,那么数据库应该能够做到。尝试上述设置只是试一试。但它不仅对数据库不起作用,而且对数据库也没有影响Flower。我仍然看不到我的待处理任务Flower。我只能在工人开始并改变他们的状态时看到他们。

标签: pythondjangorabbitmqceleryflower

解决方案


推荐阅读