如何将任务结果也从Celery客户端代码存储到数据库?

时间:2018-07-23 10:54:02

标签: python django rabbitmq celery flower

我正在尝试动手解决芹菜的问题。到目前为止,一切看起来都很好。我只是无法弄清一件事:

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

因此,目前我的配置中包含以下两行:

intl.cpl

这将更新数据库中由工作程序管理的任务的所有状态,包括$sql_ins = "select user_first_name, user_last_name, user_id from user INNER JOIN xyz on user_id=s_id where (s_id='".$_SESSION['user']."' OR r_id='".$_SESSION['user']."') AND user_id!='".$_SESSION['user']."' group by user_id UNION SELECT user_first_name, user_last_name, user_id from user INNER JOIN xyz on user_id=r_id WHERE (r_id='".$_SESSION['user']."' OR s_id='".$_SESSION['user']."') AND user_id!='".$_SESSION['user']."' GROUP BY user_id"; 状态。

但是我想要的是也要具有客户端应有的状态,例如CELERY_RESULT_BACKEND = 'django-db' CELERY_TASK_TRACK_STARTED = True 。因此,只要工作程序没有得到任务,DB中的结果就以STARTED开头,然后当工作程序启动/获取该任务时,状态为PENDINGPENDING等。已更新为数据库。

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

我的问题是:

  1. 有可能吗?因为这样,数据库中的任务行必须由客户端代码创建,然后在更新任务状态时,工作程序必须标识正确的任务。可能不是通过任何Celery配置,而是通过编写自定义代码?

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

0 个答案:

没有答案