在芹菜中如何获取特定任务名称的所有任务的任务状态?

时间:2013-07-22 09:02:43

标签: python celery celery-task celeryd

celery中,我想获取特定任务名称的所有任务的任务状态。对于尝试下面的代码。

import celery.events.state

# Celery status instance.
stat = celery.events.state.State()

# task_by_type will return list of tasks.
query = stat.tasks_by_type("my_task_name")

# Print tasks.
print query

现在我在这段代码中得到空列表。

3 个答案:

答案 0 :(得分:1)

这不是原生支持的。根据后端(Mongo,Redis等),您可能会或可能无法反省队列的内容并找出其中的内容。即使你这样做,也会错过当前正在进行的项目。

那就是说,你可以自己管理:

result = mytask.delay(...)
my_datastore.save("mytask", result.id)
...
for id in my_datastore.find(task="mytask"):
    res = AsyncResult(id)
    print res.state

答案 1 :(得分:1)

在celery中,如果要从其他功能访问任务,则可以通过任务ID访问它们,从而轻松找到任务的状态。

示例代码:-

@task(name='Sum_of_digits')
def ABC(x,y):
   return x+y
  

添加此任务进行处理

 res = ABC.delay(1, 2)
  

现在使用任务 res 来获取状态,状态和结果(res.get())

 print(f"id={res.id}, state={res.state}, status={res.status}")

答案 2 :(得分:0)

celery.events.state.State()是用于跟踪芹菜工作者和任务状态的数据结构。调用State()时,您会得到一个没有数据的空状态对象。

您应该使用app.events.Receiver(流处理)或celery.events.snapshot(批处理)来捕获包含任务的状态。

示例代码:

from celery import Celery

def my_monitor(app):
    state = app.events.State()

    def announce_failed_tasks(event):
        state.event(event)
        # task name is sent only with -received event, and state
        # will keep track of this for us.
        task = state.tasks.get(event['uuid'])

        print('TASK FAILED: %s[%s] %s' % (
            task.name, task.uuid, task.info(),))

    with app.connection() as connection:
        recv = app.events.Receiver(connection, handlers={
                'task-failed': announce_failed_tasks,
                '*': state.event,
        })
        recv.capture(limit=None, timeout=None, wakeup=True)

if __name__ == '__main__':
    app = Celery(broker='amqp://guest@localhost//')
    my_monitor(app)