如何按任务nam检查和取消芹菜任务

2024-05-15 16:45:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我用芹菜(3.0.15)和Redis做经纪人。

有没有一种简单的方法可以查询芹菜队列中具有给定名称的任务数?

接下来,是否有方法取消芹菜队列中存在的具有给定名称的所有任务?

我已经经历了Monitoring and Management Guide的考验,但没有找到解决办法。


Tags: and方法名称redis队列经纪人management经历
3条回答

有一个问题,早期的答案没有解决,如果人们不知道的话,可能会被抛弃。

在已经发布的这些解决方案中,我将使用Danielle's进行一个小修改:将任务导入到我的文件中,并使用其.name属性获取要传递给.tasks_by_type()的任务名称。

app.control.revoke(
    [uuid for uuid, _ in
     celery.events.state.State().tasks_by_type(task.name)])

但是,此解决方案将忽略那些已计划在以后执行的任务。与一些对其他答案发表评论的人一样,当我检查返回内容时,我的列表为空。实际上我的队伍是空的。但我知道有一些任务计划在未来执行,这些任务是我的主要目标。我可以通过执行celery -A [app] inspect scheduled看到它们,但它们不受上面代码的影响。

通过执行以下操作,我成功地撤消了计划任务:

app.control.revoke(
    [scheduled["request"]["id"] for scheduled in
     chain.from_iterable(app.control.inspect().scheduled()
                         .itervalues())])

app.control.inspect().scheduled()返回一个字典,该字典的键是工作机名称,值是调度信息的列表(因此,需要从itertools导入的chain.from_iterable)。任务信息位于计划信息的"request"字段中,并且"id"包含任务id。请注意,即使在吊销之后,计划任务仍将显示在计划任务中。在计划任务的计时器过期或芹菜执行某些清理操作之前,被吊销的计划任务不会从计划任务列表中删除。(重新启动工人会触发此类清理。)

您可以在一个请求中完成此操作:

app.control.revoke([
    uuid
    for uuid, _ in
    celery.events.state.State().tasks_by_type(task_name)
])
# Retrieve tasks
# Reference: http://docs.celeryproject.org/en/latest/reference/celery.events.state.html
query = celery.events.state.tasks_by_type(your_task_name)

# Kill tasks
# Reference: http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks
for uuid, task in query:
    celery.control.revoke(uuid, terminate=True)

相关问题 更多 >