我正在尝试动手解决芹菜的问题。到目前为止,一切看起来都很好。我只是无法弄清一件事:
我希望将任务结果存储在数据库中,以便在将消息发送给代理时,不仅从工作人员而且从客户端应用程序更新状态。
因此,目前我的配置中包含以下两行:
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
开头,然后当工作程序启动/获取该任务时,状态为PENDING
,PENDING
等。已更新为数据库。
背后的原因是,我们希望我们的数据库具有所有任务的记录,即使它们仍处于待处理状态(即尚未由任何工作人员选择)。
我的问题是:
有可能吗?因为这样,数据库中的任务行必须由客户端代码创建,然后在更新任务状态时,工作程序必须标识正确的任务。可能不是通过任何Celery配置,而是通过编写自定义代码?
我遇到了STARTED
,这使Celery客户发送事件,而事件又使SUCCESS
能够显示CELERY_SEND_TASK_SENT_EVENT = True
任务。我的猜测是,如果Flower
可以从客户端代码中获取这些事件,然后再从worker中的事件中更新正确的状态,那么数据库也应该可以。尝试以上设置只是尝试一下。但是,它不仅不适用于数据库,而且对PENDING
也没有任何影响。我仍未在Flower
上看到待处理的任务。我只能在工作人员启动并更改其状态时才能看到它们。