我已经将独立批处理作业转换为使用芹菜来分派要完成的工作。我正在使用RabbitMQ。一切运行在单台机器上,其他进程都不使用RabbitMQ实例。我的脚本创建了一组由工作人员处理的任务。测量芹菜任务执行时间
有没有简单的方法来衡量从我的脚本开始到所有任务完成的时间?使用消息队列时,我知道这样设计有点复杂。但我不想在生产中做到这一点,只是为了测试和获得性能评估。
我已经将独立批处理作业转换为使用芹菜来分派要完成的工作。我正在使用RabbitMQ。一切运行在单台机器上,其他进程都不使用RabbitMQ实例。我的脚本创建了一组由工作人员处理的任务。测量芹菜任务执行时间
有没有简单的方法来衡量从我的脚本开始到所有任务完成的时间?使用消息队列时,我知道这样设计有点复杂。但我不想在生产中做到这一点,只是为了测试和获得性能评估。
您可以使用chord通过在末尾添加一个假任务来传递任务发送的时间,这将返回当前时间和执行时间之间的差异。
import celery
import datetime
from celery import chord
@celery.task
def dummy_task(res=None, start_time=None):
print datetime.datetime.now() - start_time
def send_my_task():
chord(my_task.s(), dummy_task.s(start_time=datetime.datetime.now()).delay()
send_my_task
将要与一个dummy_task
,将打印过了多长时间(或多或少)来分析沿着任务。如果你想要更准确的数字,我建议直接将start_time传递给你的任务,并使用signals。
你可以使用celery signals,注册功能将之前被执行的任务后调用,这是微不足道的测量经过时间:
from time import time
from celery.signals import task_prerun, task_postrun
d = {}
@task_prerun.connect
def task_prerun_handler(signal, sender, task_id, task, args, kwargs):
d[task_id] = time()
@task_postrun.connect
def task_postrun_handler(signal, sender, task_id, task, args, kwargs, retval, state):
try:
cost = time() - d.pop(task_id)
except KeyError:
cost = -1
print task.__name__, cost
但dummy_task将是另一个任务,并可以在不同的工作人员或执行比原来的任务晚得多。 – homm
@homm,是的,但是OP明确指出有一个工作节点,并且没有其他进程正在使用RabbitMQ节点,因此只计算我们正在测量的任务。唯一的延迟来自最后一次接收时间测量任务,但和弦位于1秒周期性定时器上。 –
没有其他进程,但没有“没有其他任务”,对吗?如果没有空闲的工作进程,dummy_task将会等待。 – homm