Django芹菜周期性任务没有运行(Heroku)?

问题描述:

我有一个我用Heroku部署的Django应用程序。我试图用芹菜来每分钟创建一个定期任务。然而,当我观察日志使用以下命令工人:Django芹菜周期性任务没有运行(Heroku)?

heroku logs -t -p worker 

我没有看到正在执行我的任务。也许我错过了一个步骤?这是我下面的配置...

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) 

有一点要补充。当我使用python shell和“delay()”命令运行任务时,任务确实运行(它显示在日志中) - 但它只运行一次并且仅在执行时运行。

您需要为拍过程中单独的工作人员(其负责执行的周期性任务):

web: gunicorn activiist.wsgi --log-file - 
worker: celery worker --app=trending.tasks.app 
beat: celery --app=trending.tasks.app 

工人是没有必要的定期任务,使相关线路可以省略。另一种可能是打工人里面嵌入:

web: gunicorn activiist.wsgi --log-file - 
worker: celery worker --app=trending.tasks.app -B 

,但引述celery documentation

您还可以通过使工人能够启动工作内嵌入拍-b选项,这是方便,如果您将永远不会运行多个工作节点,但它不常用,因此不推荐用于生产使用