2015-11-24 10 views
9

w Dokumentach seler, tam jest example z inspekcji zadań wykonującym:Jak odzyskać oczekujące i wykonujące zadania związane z selerem z ich argumentami?

Można uzyskać listę aktywnych zadań przy użyciu aktywny():

>>> i.active() 
[{'worker1.example.com': 
    [{'name': 'tasks.sleeptask', 
     'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf', 
     'args': '(8,)', 
     'kwargs': '{}'}]}] 

Ale to wywołanie zwraca tylko reprezentacje argumenty, uzyskane przez repr(). Czy istnieje sposób na uzyskanie argumentów z serializowanymi zadaniami?

+1

'eval()' na wartości 'args' zwróci krotkę – economy

Odpowiedz

5

Czy chcesz włamać się na podstawowy kod Celery? Reprezentacja wróciła poprzez .active() ostatecznie przechodzi przez ten kod: https://github.com/celery/celery/blob/b1deab39aad2fdec95f48b9f6e19ca1967285544/celery/utils/saferepr.py#L68

A jest ustawiony na wniosek tutaj: https://github.com/celery/celery/blob/master/celery/worker/request.py#L120

Można zmodyfikować te funkcje do zwrotu cokolwiek reprezentacja obiektów, które od pożądanej ... Oczywiście robienie tego może złamać coś innego.

Co więcej, @economy miał dobry komentarz na temat ewentualnego ewaluacji repr. Wszystko zależy od tego, jaki jest Twój główny cel.

+0

Zamierzam zajrzeć do tego, dzięki za wskaźnik. – economy

7

OK, przedstawię to jako odpowiedź. Mam nadzieję, że to rozwiąże twoje obawy.

Selery oferuje ciąg znaków dla argumentów. Aby sobie z tym poradzić, a otrzymasz listę:

args = '(5,6,7,8)' # from celery status 

as_list = list(eval(args)) 

oczywiście eval() jest trochę niebezpieczne, więc możesz używać dosłownego eval:

import ast 

args = '(5,6,7,8)' # from celery status 

as_list = list(ast.literal_eval(args)) 

To jak sobie radzić parsowania args Seler w moim przepływy pracy. To rodzaj bólu.