2016-08-03 17 views
0

Ich versuche Sellerie zu verwenden, um Hintergrundaufgaben zu behandeln. Im Moment habe ich die folgende Einstellung:Python Sellerie Teilaufgabe Gruppe nicht ausgeführt

@app.task 
def test_subtask(id): 
    print('test_st:', id) 


@app.task 
def test_maintask(): 
    print('test_maintask') 
    g = group(test_subtask.s(id) for id in range(10)) 
    g.delay() 

test_maintask geplant wird alle n Sekunden auszuführen, was funktioniert (ich sehe die print-Anweisung in der Kommandozeilen-Fenster erscheinen, wo ich die Arbeiter gestartet). Was ich versuche zu tun, ist diese geplante Aufgabe spawnen eine Reihe von Teilaufgaben, die ich hier mit group() gruppiert habe.

Es scheint jedoch, als ob keine der test_subtask Aufgaben ausgeführt werden. Was mache ich falsch? Ich habe keine Timing-/Ergebnisbeschränkungen für diese Teilaufgaben und möchte nur, dass sie asynchron in einer bestimmten Reihenfolge ablaufen. n Sekunden später wird test_maintask erneut (und wieder) ausgelöst, aber keiner der Teilaufgaben wird ausgeführt.

Ich verwende einen Arbeiter, einen Beat und AMQP als Broker (auf einem separaten Rechner).

BEARBEITEN: Für was es wert ist, scheint das Problem rein wegen einer Aufgabe zu sein, die eine andere anruft (und nicht etwas wegen der Hauptaufgabe, die geplant wird). Wenn ich die Hauptaufgabe manuell aufrufen:

celery_funcs.test_maintask.delay() 

Ich sehe die print-Anweisung Hauptaufgabe aber - wieder - nicht die Subtasks. Der Aufruf eines Unterauftrags direkt aber funktioniert:

celery_funcs.test_subtask.delay(10) 

Antwort

0

Seufz ... gerade herausgefunden, die Antwort, ich folgendes verwendet, um meine Sellerie App zu konfigurieren:

app = Celery('celery_app', broker='<my_broker_here>') 

Merkwürdigerweise ist dies nicht gepflückt werden up in der Aufgabe selbst ... das heißt,

print('test_maintask using broker', app.conf.BROKER_URL, current_app.conf.BROKER_URL) 

Gibt zurück '<my_broker_here>' und None jeweils die Gruppe verursacht zu ... einige Standard-Broker zu senden von (ich glaube?).

Hinzufügen BROKER_URL zu app.conf.update der Trick funktioniert, obwohl ich auf noch nicht ganz klar bin, was hier in Sellerie Interna los ist ...