2016-05-19 5 views
1

Ich habe eine Django-App, wo ich eine Aufgabe über Sellerie über Redis laufen lassen.Fehlerbehebung Sellerie Arbeiter mit Supervisor für Django App

Das Projekt Ordnerstruktur ist wie folgt:

/mhb11/myfolder/myproject 
├── myproject 
│ ├── celery.py  # The Celery app file 
│ ├── __init__.py  # The project module file (modified) 
│ ├── settings.py  # Including Celery settings 
│ ├── urls.py 
│ └── wsgi.py 
├── manage.py 
├── celerybeat-schedule 
└── myapp 
    ├── __init__.py 
    ├── models.py 
    ├── tasks.py  # File containing tasks for this app 
    ├── tests.py 
    └── views.py 

Ich habe celery.conf in /etc/supervisor/conf.d, die enthält:

[program:celery] 
command=/home/mhb11/.virtualenvs/myenv/local/lib/python2.7/site-packages/celery/bin/celery --app=myproject.celery:app worker -l info 
command=/home/mhb11/.virtualenvs/myenv/local/lib/python2.7/site-packages/celery/bin/celery --app=myproject.celery:app beat -l info 
directory = /home/mhb11/myfolder/myproject 
user=mhb11 
numprocs=1 
stdout_logfile = /etc/supervisor/logs/celery-worker.log 
stderr_logfile = /etc/supervisor/logs/celery-worker.log 
autostart = true 
autorestart = true 
startsecs=10 
stopwaitsecs = 600 
killasgroup = true 
priority = 998 

Und in /etc/supervisor/logs, ich habe eine leere Datei celery-worker.log genannt. Nach dieser Einstellung, ich die folgenden Befehle lauteten:

sudo supervisorctl reread 
sudo supervisorctl update 

Nachdem Sie das getan, meine Sellerie Arbeiter sollen beginnen, aber sie tun es nicht. I.e. Nichts erscheint in der celery-worker.log Datei, die ich eingerichtet habe. Ich weiß nicht, was ich vermisse, denn es ist das erste Mal, dass ich all das aufstelle. Können Sie mir helfen, das Problem zu beheben?


djcelery ist Teil von INSTALLED_APPS. Darüber hinaus können andere relevante Einstellungen in settings.py sind:

import djcelery 
djcelery.setup_loader() 

BROKER_URL = 'redis://localhost:6379/0' 

BROKER_TRANSPORT = 'redis' 

CELERY_IMPORTS = ('myapp.tasks',) 

CELERY_ALWAYS_EAGER = False 

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' 

CELERY_ACCEPT_CONTENT = ['json'] 
CELERY_TASK_SERIALIZER = 'json' 
CELERY_RESULT_SERIALIZER = 'json' 
CELERY_IGNORE_RESULT=True 

from datetime import timedelta 

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' 

# CELERYBEAT_SCHEDULE = { 
# 'tasks.rank_all_photos': { 
#  'task': 'tasks.rank_all_photos', 
#  'schedule': timedelta(seconds=30), 
# }, 
# } 

CELERY_TIMEZONE = 'UTC' 

Mein celery.py enthält:

#this is the celery daemon 
from __future__ import absolute_import 
import os 
from celery import Celery 
from django.conf import settings 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') 

app = Celery('myapp', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0',include=['myfolder.myapp.tasks']) 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600, 
) 

if __name__ == '__main__': 
    app.start() 

__init__.py enthält:

from __future__ import absolute_import 
from .celery import app as celery_app1 

tasks.py enthält:

import os 
from myproject import celery_app1 
import time 
from myapp.models import Photo 

@celery_app1.task(name='tasks.rank_all_photos') 
def rank_all_photos(): 
    for photo in Photo.objects.order_by('-id')[:400]: 
     photo.set_rank() 

Zuletzt habe ich in meinem Django-Admin-Panel auch eine crontab und eine periodic task eingerichtet.

Was soll ich tun, um alles zu starten?

Antwort

0

Sie führen Ihren Mitarbeiter aus, Mitarbeiter müssen nur Aufgaben ausführen, aber Aufgaben müssen in die Warteschlange gestellt werden, damit die Mitarbeiter Aufgaben finden können. Sellerie schlägt die Aufgaben entsprechend dem über Django Admin festgelegten Zeitplan oder aus einer Zeitplandatei in die Warteschlange. Nach der Beat-Warteschlange ist die Aufgabe, Arbeiter finden sie und führen sie aus.

Sie müssen also einen Sellerie-Beat-Prozess separat ausführen. Ein separater Überwachungsprozeß mit

command=/home/mhb11/.virtualenvs/myenv/local/lib/python2.7/site-packages/celery/bin/celery --app=myproject.celery:app beat -l info 

Sellerie Schlag benötigt wird, wenn Sie regelmäßig/Pläne Aufgaben verwenden. Wenn Sie die Tasks nur manuell in die Warteschlange stellen, indem Sie die Methode .delay() der Task aufrufen, müssen Sie Sellerie Beat nicht ausführen.

So Ihre 2 Supervisor Dateien werden

[program:celerybeat] 
command=/home/mhb11/.virtualenvs/myenv/local/lib/python2.7/site-packages/celery/bin/celery --app=myproject.celery:app beat -l info 
directory = /home/mhb11/myfolder/myproject 
user=mhb11 
numprocs=1 
stdout_logfile = /etc/supervisor/logs/celery-beat.log 
stderr_logfile = /etc/supervisor/logs/celery-beatlog 
autostart = true 
autorestart = true 
startsecs=10 
stopwaitsecs = 600 
killasgroup = true 
priority = 998 

Arbeiter

[program:celeryworker] 
command=/home/mhb11/.virtualenvs/myenv/local/lib/python2.7/site-packages/celery/bin/celery --app=myproject.celery:app worker -l info 
directory = /home/mhb11/myfolder/myproject 
user=mhb11 
numprocs=1 
stdout_logfile = /etc/supervisor/logs/celery-worker.log 
stderr_logfile = /etc/supervisor/logs/celery-worker.log 
autostart = true 
autorestart = true 
startsecs=10 
stopwaitsecs = 600 
killasgroup = true 
priority = 998 
+0

Yep die Aufgaben sind periodische schlagen. Ich werde es versuchen und zu dir zurückkommen. Danke für das Aushelfen und Löschen des Konzepts Tahir :-) –

+0

probierte es (aktualisierte die 'conf.d' Datei in der Frage auch, damit Sie wissen, wie es jetzt aussieht), aber nichts zeigt sich in meinen Protokollen. Irgendwelche anderen führen, da dies nicht funktioniert hat? p.s. Ich "lese" und "aktualisiere" auch danach. –

+1

@HassanBaig Sie müssen 2 separaten Prozess über Supervisor erstellen. Es werden 2 separate Supervisor-Dateien benötigt. Ich habe beide Dateien hinzugefügt, um sie zu beantworten. –

Verwandte Themen