Python 如何测量芹菜任务持续时间

Python 如何测量芹菜任务持续时间,python,rabbitmq,celery,duration,Python,Rabbitmq,Celery,Duration,有没有一种简单的方法来衡量芹菜任务处理和成功完成所需的时间?有一个答案,但第一个答案是丑陋的,不幸的是,信号没有呼吁我作为第二个答案建议 FlowerUI有一个Runtime列,但它的API不允许获取批处理任务 创建任务时,存储{task\u id:start\u time} 我不确定您是如何得到结果的,但假设您正在做以下事情: for task in tasks: result = task.get() 您可以将其更改为: end_times = {} While len(end_t

有没有一种简单的方法来衡量芹菜任务处理和成功完成所需的时间?有一个答案,但第一个答案是丑陋的,不幸的是,信号没有呼吁我作为第二个答案建议


FlowerUI有一个
Runtime
列,但它的API不允许获取批处理任务

创建任务时,存储{task\u id:start\u 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
然后计算出你从开始到结束的长度

也许有更好的办法,但我正要出去过年


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

任务事件可用于获取任务的运行时持续时间。有关更多详细信息,请参阅此。celery中支持的任务事件包括已发送任务、已接收任务、任务已启动、任务成功、任务失败、任务已拒绝、任务已撤销、任务重试。要度量任务持续时间,可以使用“任务成功”事件。请在下面找到代码片段

    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()

你是想测量从创建任务到获得任务结果的时间,还是只想测量实际任务的时间长度?@BenMcAlindin,它们不同吗?基本上,我想测量创建任务直到返回结果的时间。对于一个任务,它不应该是(除了一些小的开销)。如果有许多任务排队,通常来自许多用户,这可能会导致某些任务被阻止,并需要更长的时间才能返回结果。@BenMcAlindin,这是有道理的。因此,这将是创建任务的时间,直到返回结果。完整往返。一个可能的技巧是使用日志消息:开始时有一条消息,结束时有一条消息:然后您可以看到每个任务的持续时间(考虑日志消息中的任务id)。芹菜任务上没有
运行时
属性。