Celery:查询待处理任务的标准方法?
有没有什么标准的方法,可以不依赖于具体的后台系统,来查询一些待处理的任务,基于某些特定的字段?
举个例子,我有一个任务需要在“最后一次用户操作”之后运行一次,我想实现的方式大概是这样的:
def user_changed_content():
task = find_task(name="handle_content_change")
if task is None:
task = queue_task("handle_content_change")
task.set_eta(datetime.now() + timedelta(minutes=5))
task.save()
或者直接连接到存储的后台系统会更简单吗?
1 个回答
9
不,这样做是不可能的。
即使有些传输方式可能支持不按顺序访问“队列”(比如Redis),但这样做并不好。
因为任务可能已经不在队列里了,而是被某个工作者保留了。
你可以查看文档中的这一部分:http://docs.celeryproject.org/en/latest/userguide/tasks.html#state
因此,更好的做法是让任务在开始时检查自己是否需要重新安排:
@task
def reschedules():
new_eta = redis.get(".".join([reschedules.request.task_id, "new_eta"])
if new_eta:
return reschedules.retry(eta=new_eta)