【问题标题】:Django Celery Periodic Task not running (Heroku)?Django Celery 定期任务未运行(Heroku)?
【发布时间】:2016-12-28 10:40:22
【问题描述】:

我有一个使用 Heroku 部署的 Django 应用程序。我正在尝试使用 celery 每分钟创建一个周期性任务。但是,当我使用以下命令观察工作人员的日志时:

heroku logs -t -p worker 

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

过程文件

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()”命令运行任务时,任务确实运行(它显示在日志中)——但它只运行一次,并且只在执行时运行。

【问题讨论】:

    标签: python django heroku celery


    【解决方案1】:

    beat 进程需要单独的 worker(负责执行周期性任务):

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

    周期性任务不需要 Worker,因此可以省略相关行。另一种可能性是在工作人员中嵌入节拍:

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

    但要引用celery documentation

    您也可以通过启用workers -B 选项开始在worker中嵌入beat,如果您永远不会运行多个worker节点,这很方便,但它不常用,因此不建议在生产环境中使用

    p>

    【讨论】: