Immer task_id innerhalb einer Sellerie Aufgabe
Dies ist wahrscheinlich eine dumme Frage aber die hat mich ratlos aus einem Rubinroten hintergrund.
Ich habe ein Objekt, das so aussieht, wenn ich versuche, es zu drucken.
print celery.AsyncResult.task_id
>>><property object at 0x10c383838>
Ich hatte erwartet, den tatsächlichen Wert der task_id-Eigenschaft gedruckt sehen. Wie bekomme ich den tatsächlichen Wert?
UPDATE 1
@celery.task
def scan(host):
print celery.AsyncResult.task_id
cmd = 'ps -ef'
cm = shlex.split(cmd)
scan = subprocess.check_output(cm)
return scan
Beste Grüße.
- Erstellen Sie eine Instanz der Klasse.
property
s sind Deskriptoren werden verwendet, um Attribut-wie der Zugriff auf getter/setter-Methoden, aber Sie funktionieren auf der Instanz-Ebene. Wenn der Zugriff von der Klasse erhalten Sie einfach denproperty
wrapper. - solltest du eigentlich post dies als eine Antwort 🙂
- Aus dem Brief-Gehäuse und Ausgang-es sieht aus wie
celery.AsyncResult
muss der name der Klasse, nicht einer Instanz von einer, undtask_id
ist eine Eigenschaft, Attribut der Klasse-das ist was Bakuriu ist zu sagen, dass ich glaube.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Geschichte, Funktion within
scan
verwendenscan.request.id
.Sehen http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request-info
celery.current_task.request.id
innerhalb der Aufgabe gearbeitetZugriff auf die
Eigenschaft
aus der Klasse, währendtask_id
ist eine Eigenschaft von Instanzen vonAsyncResult
.Erhalten Sie den Wert
task_id
müssen Sie zunächst erstellen Sie eine Instanz der Klasse, danach Zugriff aufasync_result_instance.task_id
werden Sie wieder die real-id.In Ihrer aktualisierten code:
Hier haben Sie Zugriff auf die Klasse, wie ich schon erklärt. Was Sie wollen, ist eine Instanz des aktuell ausgeführten Aufgabe. Sie könnten
Sellerie.current_task
, um die aktuell ausgeführte task-Objekt:Oder, wenn Sie daran interessiert sind, die eindeutige id verwenden, die
Anfrage
Attribut der dekorierten Funktion:In diesem zweiten Fall tun nicht Verwendung jede lokale variable namens
scan
sonst wirst du einUnboundLocalError
.(Code nicht getestet, da ich nicht
celery
installiert).Den
property
s sind Deskriptoren verwendet, um Attribut-wie der Zugriff auf getter/setter-Methoden, so dass Sie Zugriff auf Daten wie:Aber wenn der code ausgeführt wird, der setter oder getter kontrollieren kann, was Los ist.
Überprüfen kann man das mit einem dummy-Klasse:
Um Ihre Aufgaben noch "OO-like", könnte die
bind
argument um eine Referenz zuself
:Bitte beachten Sie, dass
self.request.id
ist tatsächlich eine InstanzAsyncTask
. Um die task-id als string, die Sie tun solltenself.request.id.__str__()
.Vom Sellerie in der Dokumentation (nach dem Beispiel):