我正在尝试从Celery检索所有当前的pending
和active
任务。
active
,scheduled
和reserved
很容易获得:
i = celery_app.control.inspect()
tasks=list()
for k in i.active():
tasks += i.active()[k]
for k in i.reserved():
tasks += i.reserved()[k]
for k in i.scheduled():
tasks += i.scheduled()[k]
但是,这不包括尚未scheduled
或reserved
的任务。以下代码检索这些任务,但显然只适用于Redis,假定JSON序列化,并且由于各种原因它并不理想。
r = redis.StrictRedis(
host='localhost',
port='6379',
)
tasks = [json.loads(pending_task)['headers'] for pending_task in r.lrange('celery', 0, -1)]
有没有办法以类似于pending
的形式检索这些inspect.active()
任务,并且可以轻松访问args
,kwargs
,id
(最好通过Celery,所以我不需要指定Celery后端和序列化等)?
据我所知,这并不简单,芹菜中没有i.pending()
。所以,我有几个子问题可以让我自己写这个。
queues = [q['exchange']['name'] for host in i.active_queues().values() for q in host])
r.lrange('celery', 0, -1)
的通用版本。json.loads(...) above
celery_app.backend.decode
使用该信息,从消息标题中提取必要的信息应该很简单。