Mám aplikáciu Django, ktorú som nasadils Heroukom. Snažím sa používať zeler na vytvorenie periodickej úlohy každú minútu, ale keď pozorujem protokoly pre pracovníka pomocou nasledujúceho príkazu:
heroku logs -t -p worker
Nevidím, že moja úloha bola vykonaná. Možno je to krok, ktorý mi chýba? Toto je moja konfigurácia nižšie ...
Procfile
web: gunicorn activiist.wsgi --log-file -
worker: celery worker --app=trending.tasks.app
Tasks.py
import celery
app = celery.Celery("activiist")
import os
from celery.schedules import crontab
from celery.task import periodic_task
from django.conf import settings
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.update(BROKER_URL=os.environ["REDIS_URL"],
CELERY_RESULT_BACKEND=os.environ["REDIS_URL"])
os.environ["DJANGO_SETTINGS_MODULE"] = "activiist.settings"
from trending.views import *
@periodic_task(run_every=crontab())
def add():
getarticles(30)
Jedna vec, ktorú pridáte. Keď spustim úlohu pomocou shellu pythonu a príkazu "delay ()", úloha skutočne beží (zobrazuje sa v protokoloch), ale spúšťa sa iba raz a iba pri spustení.
odpovede:
-1 pre odpoveď č. 1Potrebujete oddelenú pracovníkovku na proces tlkotu (ktorý je zodpovedný za vykonávanie pravidelných úloh):
web: gunicorn activiist.wsgi --log-file -
worker: celery worker --app=trending.tasks.app
beat: celery --app=trending.tasks.app
Pracovník nie je potrebný pre pravidelné úlohy, takže príslušný riadok môže byť vynechaný, inou možnosťou je vložiť beat vnútri pracovníka:
web: gunicorn activiist.wsgi --log-file -
worker: celery worker --app=trending.tasks.app -B
ale citovať celer dokumentácia:
Môžete tiež začať vkladať beat vnútri pracovníkatým, že umožníte pracovníkovi možnosť -B, je to výhodné, ak nikdy nespustíte viac než jeden pracovný uzol, ale nie je bežne používaný a z tohto dôvodu sa nedoporučuje na použitie v produkcii