Heroku 上的 Celery 作业不是 运行(python/django 应用程序)

Celery jobs not running on heroku (python/django app)

我有一个包含一些计划任务的 Django 应用程序设置。该应用程序使用 Redis 部署在 Heroku 上。如果在控制台中同步调用任务 运行s,或者当我还有 redis 和 celery 运行ning 时在本地调用。但是,Heroku 上的计划作业未 运行ning。

我的任务:

@shared_task(name="send_emails")
def send_emails():
.....

celery.py:

from __future__ import absolute_import, unicode_literals

import os
from celery import Celery
from celery.schedules import crontab

# set the default Django settings module for the 'celery' program.
# this is also used in manage.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings')

# Get the base REDIS URL, default to redis' default
BASE_REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379')

app = Celery('my_app')

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

app.conf.broker_url = BASE_REDIS_URL

# this allows you to schedule items in the Django admin.
app.conf.beat_scheduler = 'django_celery_beat.schedulers.DatabaseScheduler'

# These are the scheduled jobs
app.conf.beat_schedule = {
    'send_emails_crontab': {
        'task': 'send_emails',
        'schedule': crontab(hour=9, minute=0),
        'args': (),
    }
}

在配置文件中: worker: celery -A my_app worker --beat -S django -l info

我已经用 heroku ps:scale worker=1 -a my-app 启动了 worker。 我可以在工作日志中的 [tasks] 下看到已注册的任务。 但是,计划任务并未 运行 在其计划时间执行。在生产控制台中调用 send_emails.delay() 确实有效。 我如何让工人在预定的时间活着和/或 运行 工作?

我有一个使用命令和 heroku 调度程序的解决方法。只是不确定这是否是最好的方法。

如果您正在免费试用,您应该知道 heroku 服务器正在休眠,如果您的计划任务在您的服务器休眠时到期,它不会 运行。

我有任何想法都可以分享给你。

  1. 运行 控制台并获取 Dyno 的日期时间。 Dyno 使用美国当地时间。

  2. DynoFree 每 30 分钟休眠一次,只有 450 分钟 hours/month。

  3. 尝试将 celery 更改为 BackgroundScheduler, 您需要添加一个脚本 clock.py 作为:

     from myapp import myfunction
     from datetime import datetime
     from apscheduler.schedulers.background import BackgroundScheduler
     from apscheduler.schedulers.blocking import BlockingScheduler
     from time import monotonic, sleep, ctime
     import os
    
     sched = BlockingScheduler()
     hour = int(os.environ.get("SEARCH_HOUR"))
     minutes = int(os.environ.get("SEARCH_MINUTES"))
    
     @sched.scheduled_job('cron', day_of_week='mon-sun', hour=hour, minute = minutes)
     def scheduled_job():
         print('This job: Execute myfunction every at ', hour, ':', minutes)        
         #My function
         myfunction()
    
     sched.start(
    

)

在过程文件中:

clock: python clock.py

和运行:

heroku ps:scale clock=1 --app thenameapp

此致。