2017-10-19 1 views
0

Ich habe eine Flask-Anwendung, mit der ich eine Sellerie-Aufgabe starten kann. Diese Aufgabe ist eine Art Daemon, den ich nur einmal starten möchte. Wenn es gestartet wird, will ich nur seinen Status überwachen, eine Nachricht von der Aufgabe anzeigen usw. Das funktioniert alles gut.Wie kann ich wissen, ob eine Sellerie-Aufgabe bereits gestartet wurde?

Was ich nicht herausfinden kann, wie es geht, ist, wie ich in der Flaschen-Anwendung die Aufgaben-ID bekommen kann, sobald sie gestartet ist. Wenn ich die Aufgabe starte kann ich

tun, also habe ich die ID der Aufgabe.

Nun stellen Sie sich vor, ich starte den Sellerie-Server neu oder ich erledige die Aufgabe, wie kann ich überprüfen, ob eine solche Aufgabe ausgeführt wird? Und wenn es läuft, wie kann ich seine ID abrufen?

Was ich jetzt versucht: eine Sellerie-Server laufen, die eine Flasche Anwendung ausführen, eine Sellerie Aufgabe von whithin den Kolben Anwendung starten, laden Sie die Haupt-Seite zu sehen, ob ich die Aufgabe ID abrufen kann:

@main.route('/', methods=['GET', 'POST']) 
def index(): 
    """Renders the home page.""" 
    _t = celery.current_task 
    if _t is not None: 
     t_id = toto.request.id 
    return render_template('main/index.html', title='Main page') 

aber die Variable _t ist immer None, auch wenn eine Sellerie-Aufgabe läuft.

+0

Beachten Sie, dass dies eine schlechte Methode ist, Sellerie zu verwenden. Es ist nicht für eine lange laufende Aufgabe konzipiert. Ziemlich genau für das, was Sie hier fragen. Sie möchten wahrscheinlich einen ['Manager'] (https://docs.python.org/3/library/multiprocessing.html#managers). – davidism

+0

Welches Ergebnis Backend verwendest du? – georgexsh

+0

Redis für Sellerie Backend – GuillaumeA

Antwort

0

Eine Möglichkeit (über Sellerie-API) wäre es, die control client zu überprüfen. Es kann Ihnen helfen reserved Aufgaben, active Aufgaben zu untersuchen und so weiter ..

i = app.control.inspect() 
i.reserved() 

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

Sie können diese Aufgabe Array iterieren zu (von Task-Namen) zu finden, wenn Ihre Aufgabe bereits läuft und abrufen es Zustand ist).

für weitere Informationen: http://docs.celeryproject.org/en/latest/userguide/workers.html#dump-of-reserved-tasks

Zweite Option (was meiner Meinung nach eine schlechte Idee ist) könnte sein, die backend direkt zu überprüfen: Wenn diese Redis nur als Sellerie-Backend verwendet, und Sie haben diese Aufgabe nur Laufen - Sie können finde alle Schlüssel (uuid ist Teil des Schlüssels) und der Aufgabenstatus ist Teil des Wertes.

Verwandte Themen