2013-10-20 5 views
6

Ich habe einen eigenständigen Batch-Job konvertiert, um Sellerie für den Versand der Arbeit zu verwenden. Ich benutze RabbitMQ. Alles läuft auf einer einzigen Maschine und keine anderen Prozesse verwenden die RabbitMQ-Instanz. Mein Skript erstellt nur eine Reihe von Aufgaben, die von Arbeitern verarbeitet werden.Messung Sellerie Aufgabe Ausführungszeit

Gibt es eine einfache Möglichkeit, die Zeit vom Beginn meines Skripts bis zum Abschluss aller Aufgaben zu messen? Ich weiß, dass dies bei der Verwendung von Nachrichtenwarteschlangen etwas kompliziert ist. Aber ich möchte es nicht in der Produktion machen, nur zum Testen und um eine Leistungsschätzung zu bekommen.

Antwort

5

Sie könnten eine chord verwenden, indem Sie am Ende eine falsche Aufgabe hinzufügen, die die Zeit, zu der die Aufgaben gesendet wurden, übergeben würde, und die die Differenz zwischen der aktuellen Uhrzeit und der verstrichenen Zeit zurückgeben würde.

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 sendet die Aufgabe, die Sie zusammen mit einem dummy_task ein Profil erstellen möchten, die gedruckt werden soll, wie lange es gedauert hat (mehr oder weniger). Wenn Sie genauere Zahlen wünschen, empfehle ich, die start_time direkt an Ihre Aufgaben zu übergeben und die signals zu verwenden.

+1

Aber dummy_task eine andere Aufgabe sein wird, und kann auf verschiedenen Arbeiter ausgeführt werden oder signifikant später als die ursprüngliche Aufgabe. – homm

+0

@homm, ja, aber das OP hat explizit gesagt, dass es einen einzelnen Worker-Knoten gibt und keine anderen Prozesse den RabbitMQ-Knoten verwenden, daher werden nur die Tasks berechnet, die wir messen. Die einzige Verzögerung ergibt sich aus dem Empfang der Zeitmessaufgaben zum letzten Mal, aber der Akkord ist auf einem 1-Sekunden-Zeitgeber. –

+0

Keine anderen Prozesse, aber keine "anderen Aufgaben", oder? Wenn es keine freien Worker-Prozesse gibt, wartet dummy_task. – homm

18

Sie celery signals nutzen könnten, registriert Funktionen vor und nach einer Aufgabe ausgeführt wird aufgerufen werden, ist es trivial verstrichene Zeit zu messen:

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