Python 如何按任务名称检查和取消芹菜任务
我使用芹菜(3.0.15)和Redis作为代理 有没有一种简单的方法可以查询芹菜队列中存在的具有给定名称的任务数 接下来,是否有方法取消芹菜队列中存在的具有给定名称的所有任务Python 如何按任务名称检查和取消芹菜任务,python,redis,celery,Python,Redis,Celery,我使用芹菜(3.0.15)和Redis作为代理 有没有一种简单的方法可以查询芹菜队列中存在的具有给定名称的任务数 接下来,是否有方法取消芹菜队列中存在的具有给定名称的所有任务 我已经通过了,但没有看到解决方案。看起来flower提供了监控: # Retrieve tasks # Reference: http://docs.celeryproject.org/en/latest/reference/celery.events.state.html query = celery.events.st
我已经通过了,但没有看到解决方案。看起来
flower
提供了监控:
# 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)
使用芹菜事件进行实时监控
显示任务详细信息(参数、,
启动时间、运行时间等)图形和统计信息远程控制
查看工作程序状态和统计信息关闭并重新启动工作程序
实例控制工作池大小和自动缩放设置视图和
修改工作实例当前从视图中使用的队列
运行任务视图计划任务(ETA/倒计时)视图保留和
撤销的任务应用时间和速率限制配置查看器撤销
或终止任务HTTP API
OpenID身份验证
您可以在一个请求中执行此操作:
app.control.revoke([
uuid
for uuid, _ in
celery.events.state.State().tasks_by_type(task_name)
])
有一个问题,早期的答案并没有解决,如果人们不知道,可能会把他们吓跑 在已经发布的解决方案中,我只做了一个小小的修改:我将任务导入到我的文件中,并使用它的
.name
属性来获取要传递给.tasks\u by\u type()
的任务名
但是,此解决方案将忽略那些已计划在未来执行的任务。与一些对其他答案发表评论的人一样,当我选中what.tasks\u by\u type()
return时,我有一个空列表。事实上,我的队伍是空的。但我知道,有一些任务计划在未来执行,这些是我的主要目标。我可以通过执行芹菜-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\u iterable
)。任务信息位于计划信息的“request”
字段中,并且“id”
包含任务id。请注意,即使在撤销后,计划任务仍将显示在计划任务中。被撤销的计划任务在其计时器过期或芹菜执行某些清理操作之前不会从计划任务列表中删除。(重启workers会触发这样的清理。)和芹菜一样,这里的答案对我来说都不管用,所以我做了我通常做的事情,拼凑了一个直接检查redis的解决方案。我们走吧
#首先,从redis获取任务列表:
导入redis、json
r=redis.redis(
主机=settings.REDIS\u主机,
端口=settings.REDIS\u端口,
db=settings.REDIS_数据库[‘芹菜’],
)
l=r.l范围('芹菜',0,-1)
#现在导入所需的任务,以便获得其名称
从my_django.tasks导入my_任务
#现在,导入芹菜应用程序并迭代所有任务
#从redis和nuke找到具有匹配名称的。
从my_django.芹菜_init导入应用程序
对于l中的任务:
task_headers=json.load(task)['headers']
任务名称=任务标题[“任务”]
如果task_name==my_task.name:
任务\u id=任务\u头['id']
打印(“正在终止:%s”%task\u id)
app.control.revoke(任务id,terminate=True)
请注意,以这种方式撤销可能不会撤销预取的任务,因此您可能不会立即看到结果
此外,此答案不支持优先任务。如果你想修改它来实现这一点,你需要一些提示。这听起来很有希望,但我没能得到任何结果。我为我的工作人员将
CELERY\u SEND\u TASK\u SEND\u EVENT
设置为True
,但调用CELERY.events.State().tasks\u按类型(…)
返回空列表。嗯,尝试直接使用CELERY.events.State
,就像celerymon
一样。在芹菜壳中,芹菜.events.state.state
仍然给我一个空列表。是否缺少从事件队列初始化消费的步骤?好的,您是对的:您需要馈送State
对象。复制并粘贴,然后调用EventConsumer.start()
我不知道这与答案有什么关系。什么时候开始停止?当内存已满时?可怕的一行解决方案n.b.,您必须使用State()。对于芹菜4+,任务按类型进行调度。是否有任何方法可以使用命令知道哪些任务是在cron下调度的?像节拍调度器?
app.control.revoke(
[scheduled["request"]["id"] for scheduled in
chain.from_iterable(app.control.inspect().scheduled()
.itervalues())])