2016-08-31 1 views
2

Ich habe einen post_save-Hook, der eine Aufgabe auslöst, die in Sellerie ausgeführt wird. Die Task aktualisiert außerdem das Modell, wodurch der post_save-Hook ausgeführt wird. Der Haken ist, ich möchte .delay() den Aufruf in diesem Fall nicht, ich möchte es nur synchron ausführen, da es bereits in einem Worker ausgeführt wird.Ermitteln, ob die Django-Funktion in einem Sellerie-Arbeiter ausgeführt wird

Gibt es eine Umgebungsvariable oder etwas anderes, das ich verwenden kann, um festzustellen, wenn der Code in Sellerie ausgeführt wird?

Zur Klarstellung: Mir ist bewusst, dass Sellerie-Aufgaben immer noch als normale Funktionen aufgerufen werden können, genau das versuche ich zu nutzen. Ich möchte so etwas tun:

if os.environ['is_celery']: 
    my_task(1, 2, 3) 
else: 
    my_task.delay(1, 2, 3) 

Antwort

4

Normalerweise hätten Sie common.py, production.py, test.py and local.py/dev.py. Sie könnten nur ein celery_settings.py mit folgendem Inhalt hinzufügen:

from production import * 
IS_CELERY = True 

Dann in Ihrem celery.py (ich nehme an, Sie eine haben) Sie

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.celery_settings") 

Dann in Ihrem Skript tun werden Sie jetzt tun können :

if getattr(settings, 'IS_CELERY', None): 
    my_task(1, 2, 3) 
else: 
    my_task.delay(1, 2, 3) 
+0

Tolle Idee, nicht sicher, warum ich nicht daran gedacht hatte, danke! –

Verwandte Themen