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?
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 :-) –
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. –
@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. –