2016-12-12 6 views
5

Ich möchte eine periodische Aufgabe mit Sellerie dynamisch am Ende einer anderen Gruppe von Aufgabe planen.Sellerie - Periodische Aufgabe am Ende einer anderen Aufgabe planen

Ich weiß, wie (statisch) periodische Aufgaben mit Sellerie erstellen:

CELERYBEAT_SCHEDULE = { 
     'poll_actions': { 
      'task': 'tasks.poll_actions', 
      'schedule': timedelta(seconds=5) 
     } 
} 

Aber ich will dynamisch aus meiner Aufgaben periodische Arbeitsplätze schaffen (und haben vielleicht eine Möglichkeit, diese periodischen Jobs zu stoppen, wenn eine bestimmte Bedingung ist erreicht (alle Aufgaben erledigt)

Etwas wie:.

@celery.task 
def run(ids): 
    group(prepare.s(id) for id in ids) | execute.s(ids) | poll.s(ids, schedule=timedelta(seconds=5)) 

@celery.task 
def prepare(id): 
    ... 

@celery.task 
def execute(id): 
    ... 

@celery.task 
def poll(ids): 
    # This task has to be schedulable on demand 
    ... 

Antwort

3

Die einfache Lösung dieses Problems erfordert, dass Sie in der Lage sein, Beat Scheduler entr hinzufügen/entfernen ies im laufenden Betrieb. Wie die Beantwortung dieser Frage ...

How to dynamically add/remove periodic tasks to Celery (celerybeat)

war dies nicht möglich. Ich bezweifle, dass es in der Zwischenzeit verfügbar geworden ist, weil ...

Sie zwei Konzepte hier zusammenfassen. Die Idee von "Event Driven Work" und die Idee von "Batch Schedule Driven Work" (, die wirklich nur der erste Fall ist, wo das Ereignis auf einem Zeitplan passiert). Wenn Sie sich wirklich überlegen, was Sie hier tun, werden Sie feststellen, dass es einen ziemlich komplexen Satz von Kantenfällen gibt. Nachrichten werden in der Natur verteilt, was passiert, wenn Gruppen, die aus verschiedenen Nachrichten hervorgegangen sind, anfangen, widersprüchliche Einträge zu erstellen? Was machst du, wenn du dich unter einem Berg von vorher geplantem Kruft findest?

Wenn Sie mit Messaging-Systemen arbeiten, suchen Sie wirklich nach rekursiven Bäumen. Arbeitsspindeln, die etwas tun und mehr Nachrichten erzeugen, um mehr Dinge zu tun. Zyklen (beabsichtigt oder nicht) neben diesen erreichen letztlich ihre Basisfälle und enden.

Die Antwort auf das, was Sie tatsächlich erreichen möchten, liegt in der Neucodierung Ihres Problems innerhalb der Grenzen Ihres Messaging-Systems und des asynchronen Arbeitsframeworks.

Verwandte Themen