2016-05-23 8 views
2

Ich verwende Sellerie, um einige zeitgesteuerte Aufgaben durchzuführen. Mit normalen Kommandozeilen-Methoden kann ich problemlos Aufgaben generieren und ausführen. Dafür muss ich zwei Daemons kreieren, einen für Sellerie und einen für Sellerie.Lassen Sie Sellerie Arbeiter und Sellerie schlagen als Thread

Nun, obwohl Sellerie mein Problem der Erstellung und Ausführung zeitgesteuerter Aufgaben löst, kommt es auf Kosten von zwei zusätzlichen Dämonen für mein System. Ich habe bereits einen Dämon für mein Modul laufen und ich möchte es wiederverwenden (Sellerie Arbeiter hinzufügen und als ein Thread zum vorhandenen Modul schlagen). Gibt es einen Weg dazu?

Antwort

2

Sie können app.worker_main() verwenden, um den Worker als Thread auszuführen.

Da Sie es aus der Befehlszeile ausführen konnten, nehme ich an, Sie haben bereits ein Objekt für die Klasse Celery erstellt (in der Regel als app in Docs). Sie können den folgenden Code versuchen, um den Worker als Thread auszuführen.

from celeryconfig import app # config file you must have build earlier where app = Celery(), object of Celery class 

def worker(): 
    # Arguments you give on command line 
    argv = [ 
     'worker','-A','<module>.tasks', 
     '-P','gevent',  # Would probably need this argument if running with other Greenlets 
     '--loglevel=info'] 
    app.worker_main(argv) 

Erstellen Sie einfach einen Thread für die obige Methode in Ihrer Datei main.py des Moduls.

Für Sellerie Beat hatte ich früher selbst versucht, eine ähnliche Methode zu bauen. (Nicht sicher, ob bereits eine Methode existiert). Ich schrieb das folgende Verfahren und hinzugefügt, um es in die Sellerie-Klasse

def beat_main(self, argv=None): 
    return instantiate(
     'celery.bin.beat:beat', 
     app=self).execute_from_commandline(argv) 

Ihre Sellerie-Klasse in /usr/local/lib/python2.7/dist-packages/celery/app/base.py geschrieben. Versuchen Sie es wie den Worker (app.beat_main mit Argumenten). Hoffe, es funktioniert auch für dich.

Verwandte Themen