【问题标题】:django celerybeat not invoking tasks.py functiondjango celerybeat 没有调用 tasks.py 函数
【发布时间】:2020-04-28 00:39:01
【问题描述】:

根据教程:https://www.merixstudio.com/blog/django-celery-beat/

celery.py 文件代码

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from Backend.settings import INSTALLED_APPS

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: INSTALLED_APPS)

tasks.py 文件代码

from celery.task import task
@task(name='task1')
def emailt():
    print("email func invoked")
    # code...

settings.py

from __future__ import absolute_import
import os
import djcelery
from celery.schedules import crontab
djcelery.setup_loader()

INSTALLED_APPS = [
'djcelery',
'django_celery_beat',
 ....
]

REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TIMEZONE = 'Asia/Kolkata'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'   

CELERYBEAT_SCHEDULE = {
'task1': 
    {
        'task': 'proj.tasks.emailt',
        'schedule': crontab(hour='*', minute='1', day_of_week='mon,tue,wed,thu,fri,sat,sun'),
    }
} 

在一个命令 shell 中,redis 服务器和 django py manage.py runserver 正在运行。 在另一个 shell 上,celery 命令运行如下: celery -A proj.tasks beat -l INFO --scheduler django_celery_beat.scheduler:DatabaseScheduler

日志文件表示 celerybeat 正在运行。

Configuration ->
. broker -> redis://localhost:6379/0
. loader -> djcelery.loaders.DjangoLoader
. scheduler -> django_celery_beat.schedulers.DatabaseScheduler

. logfile -> [stderr]@%INFO
. maxinterval -> 5.00 seconds (5s)
[*************: INFO/MainProcess] beat: Starting...
[*************: INFO/MainProcess] Writing entries...
[*************: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[*************: INFO/MainProcess] Writing entries...
[*************: INFO/MainProcess] Writing entries...

但是,tasks.py 中的函数 emailt() 仍然没有被调用。 我无法找到 celerybeat 的问题。

【问题讨论】:

  • 我不确定,但是您将CELERYBEAT_SCHEDULER 设置为djcelery.schedulers.DatabaseScheduler,所以它使用djcelery 作为调度程序。你试过删除这条线吗?
  • @Tirzono 它没有,因为您可以清楚地看到在 log 中运行配置。调度程序 -> django_celery_beat.schedulers.DatabaseScheduler

标签: python django django-celery celerybeat


【解决方案1】:

DatabaseScheduler 是数据库调度程序实现,不从CELERYBEAT_SCHEDULE 字典中获取任务

如果您打算使用这种类型的调度程序,您应该通过 django 管理员或通过数据迁移/视图创建 PeriodicTask

您可以通过创建CrontabSchedule 并将其附加到PeriodicTask 来将crontab 表示法与任务中的默认调度程序或DatabaseScheduler 一起使用

【讨论】:

  • 对于 PeriodicTask 和 CronTabSchedule 对象,是否应该在 settings.py 文件中创建它们? (以便自动检测tasks.py文件中的方法)
  • 或者这些对象需要在celery.py文件中创建吗?
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 2022-11-10
  • 2023-03-10
  • 2020-10-15
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多