如何衡量芹菜任务的持续时间

时间:2015-12-31 18:28:17

标签: python rabbitmq celery duration

是否有一种简单的方法来衡量Celery任务处理和成功完成所需的时间?有一个intercept response,但第一个答案是丑陋的,不幸的是,我没有像第二个答案所说的那样给我发信号。

Flower UI有一个private static class ViewHolder { private CustomListener listener; private Button incrementBtn; } 列,但它的API不允许获取批量任务。

2 个答案:

答案 0 :(得分:2)

任务事件可用于获取任务的运行持续时间。有关详细信息,请参阅此link。任务发送,任务接收,任务启动,任务成功,任务失败,任务拒绝,任务撤销,任务重试是芹菜支持的任务事件。为了衡量任务持续时间,“任务成功”#39;事件可以使用。请在下面找到代码段。

    from celery import Celery
    redis = Redis(host='workerdb', port=6379, db=0)

    def my_monitor():
        app = Celery('vwadaptor', broker='redis://workerdb:6379/0',backend='redis://workerdb:6379/0')
        state = app.events.State()

        def announce_task_succeeded(event):
            state.event(event)
            task = state.tasks.get(event['uuid'])
            print "task runtime: ", task.runtime

        with app.connection() as connection:
            recv = app.events.Receiver(connection, handlers={
                    'task-succeeded': announce_task_succeeded, 
            })
            recv.capture(limit=None, timeout=None, wakeup=True)

    my_monitor()

答案 1 :(得分:0)

创建任务时,存储{task_id:start_time}

的词典

我不确定您是如何获得结果的,但假设您正在做以下事情:

for task in tasks:
    result = task.get()

您可以将其更改为:

end_times = {}
While len(end_times) != len(tasks):
    for task in tasks:
        if task.ready():
            result = task.get()
            end_times[task.id] = now() #proper datetime method

然后从开始和结束开始计算你的长度

可能有更好的方法,但我即将走出新的一年。

编辑:您可能需要处理已检索的任务