Celery:查询待处理任务的标准方法?

9 投票
1 回答
2648 浏览
提问于 2025-04-16 23:12

有没有什么标准的方法,可以不依赖于具体的后台系统,来查询一些待处理的任务,基于某些特定的字段?

举个例子,我有一个任务需要在“最后一次用户操作”之后运行一次,我想实现的方式大概是这样的:

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)

撰写回答