我正在尝试使用Celery(v 3.1.25)进行耗时的计算。我需要通过启动任务时传递的参数让已经运行的工作程序。
客户端将company_id传递给服务器,而Celery使用给定的参数启动worker。可能有许多客户端传递相同的company_id,因此我必须检查该进程是否尚未运行。如果正在运行,则不应计划任务,因为运行同一进程的结果始终相同,我们必须告诉他任务已经在运行。
@celery_app.task(bind=True)
def calculate(self, company_id):
obj_list = get_objects(company_id)
for i, obj in enumerate(obj_list):
self.update_state(state='PROGRESS', meta={'current': i, 'total': len(obj_list)})
result = calc(
registry=registry_key,
company_id=company_id,
)
return result
我正在考虑将当前状态存储在Postgres
数据库中,该数据库的模型为work_id, status (PROGRESS/SUCCESS), start_time, finish_time
。在这种情况下,问题是如何处理工作状态已更改的问题?将此类信息存储在数据库中是否正确?
还有其他解决此问题的方法吗?
我当时在看celery-once,但是没有找到可以告诉我该进程正在运行的方法(我想告诉用户)。
也许我可以对Redis做些什么?