2013-10-20 22 views
6

Przekształciłem samodzielne zadanie wsadowe, aby użyć selera do wysłania pracy do wykonania. Używam RabbitMQ. Wszystko działa na jednym komputerze i żadne inne procesy nie używają instancji RabbitMQ. Mój skrypt tworzy grupę zadań, które są przetwarzane przez pracowników.Pomiar czasu wykonywania zadania selera

Czy istnieje prosty sposób zmierzenia czasu od początku skryptu do zakończenia wszystkich zadań? Wiem, że jest to nieco skomplikowane z punktu widzenia projektu podczas korzystania z kolejek komunikatów. Ale nie chcę tego robić w produkcji, tylko do testowania i oszacowania wydajności.

Odpowiedz

5

Można użyć numeru chord, dodając fałszywe zadanie na końcu, które zostanie przekazane w czasie, w którym zadania zostały wysłane, i które zwrócą różnicę między bieżącym czasem i czasem wykonania.

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 wysyła zadanie, które chcesz do profilu wraz z dummy_task że drukowanie jak długo zajęło (bardziej lub mniej). Jeśli chcesz uzyskać dokładniejsze liczby, sugeruję, aby czas początkowy był przekazywany bezpośrednio do zadań i przy użyciu parametru signals.

+1

Ale dummy_task będzie kolejnym zadaniem i może być wykonywany na różnych pracownika lub znaczący później niż oryginalne zadanie. – homm

+0

@h, tak, ale OP wyraźnie stwierdził, że istnieje jeden węzeł roboczy i żadne inne procesy nie używają węzła RabbitMQ, więc obliczane są tylko zadania, które mierzymy. Jedyne opóźnienie pochodzi z otrzymywania pomiarów czasu po raz ostatni, ale akord znajduje się w 1-sekundowym zegarku okresowym. –

+0

Żadnych innych procesów, ale nie "żadnych innych zadań", prawda? Jeśli nie ma wolnych procesów roboczych, atrybuty dummy_task będą czekać. – homm

18

Można użyć celery signals funkcje zarejestrowanych zostanie wezwany przed i po wykonaniu zadania są wykonywane, to jest trywialne mierzyć upływający czas:

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 
Powiązane problemy