Python 如何获得完成芹菜任务所需的估计时间?

Python 如何获得完成芹菜任务所需的估计时间?,python,rabbitmq,celery,fastapi,Python,Rabbitmq,Celery,Fastapi,我正在努力获得完成芹菜任务所需的估计时间。例如,如果用户在前端触发任务A(可能通过单击按钮触发对后端的REST API调用),它将显示一个计时器,显示任务完成所需的时间 如果我没有正确阅读西芹的文档,我可以得到预定任务的预计到达时间。但是刚刚执行的当前任务呢 我最初的想法是将以前发生的类似任务的执行时间存储在数据库中,并可能做一个平均值,作为所需的估计时间。如果有人能在上面的例子中分享一些经验,那就太好了。非常感谢 方法1:使用计时装饰器 import time import functools

我正在努力获得完成芹菜任务所需的估计时间。例如,如果用户在前端触发任务A(可能通过单击按钮触发对后端的REST API调用),它将显示一个计时器,显示任务完成所需的时间

如果我没有正确阅读西芹的文档,我可以得到预定任务的预计到达时间。但是刚刚执行的当前任务呢


我最初的想法是将以前发生的类似任务的执行时间存储在数据库中,并可能做一个平均值,作为所需的估计时间。如果有人能在上面的例子中分享一些经验,那就太好了。非常感谢

方法1:使用计时装饰器

import time
import functools


def timer(func):
    @functools.wraps(func)
    def _wrapper(*args, **kwargs):
        start = time.perf_counter()
        val = func(*args, **kwargs)
        end = time.perf_counter()
        elapsed_time = end - start
        task_info = {"time": elapsed_time, task_args: args, task_kwargs: kwargs}
        # do something with this task_info, i.e log or save in db to be used for analysis later
        return val

    return _wrapper


@app.task(name="task1")
@timer
def task1(...):
  ...
方法2:使用芹菜信号

import time
from celery.signals import task_prerun, task_postrun

tasks = {}


@task_prerun.connect
def task_prerun_handler(task_id, task, **extras):
    """ Dispatched before a task is executed. """
    tasks[task_id] = time.perf_counter()


@task_postrun.connect
def task_postrun_handler(task_id, task, **extras):
    """ Dispatched after a task has been executed. """
    end = time.perf_counter()
    elapsed_time = end - tasks.pop(task_id)
    # do something with this task_info, i.e log or save in db to be used for analysis later
您可以查看的资源:


感谢您的推荐@Rupsi!但是我猜估计的时间将基于以前任务的历史运行,而不是实时估计,对吗?也就是说,有没有一种方法可以让工作人员只提供估计的完成时间,而不必基于过去的运行,而只需要运行特定任务所需的资源?