想象一下,使用一组特定的args和kwargs进行长时间运行的任务。在开始新任务之前,是否有机会使用相同的args / kwargs撤销所有正在运行和挂起的任务,因为我只对最后添加的任务的结果感兴趣。 (基础数据在两次调用之间发生变化)
我尝试迭代inspect.active()
,inspect.registered()
和inspect.scheduled()
的结果来获取所有任务,然后filter/revoke
那些我的args和kwargs的问题。
但这并不可靠,因为检查所有工人和寻找任务的时间太长了。
任何人都可以让我朝着正确的方向前进吗?
答案 0 :(得分:0)
如果检查工作人员的速度变慢,则最好通过辅助数据存储进行检查,例如,像redis这样的键值存储。您为功能添加了一个“锁”,因此您知道它已经启动了。
排队任务时:
一个工人将执行它
有一个基于Redis的现成实现:
celery-once
(permalink to current commit)。
您必须将其指定为任务的base
from celery import Celery
from celery_once import QueueOnce
@celery.task(base=QueueOnce)
def sum(a, b):
...
您还可以指定要考虑的参数和更多设置,请阅读自述文件以获取更多详细信息。