django celerybeat not invoking tasks.py function
根据教程:https://www.merixstudio.com/blog/django-celery-beat/
celery.py 文件代码
1 2 3 4 5 6 7 8 9 | 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 文件代码
1 2 3 4 5 | from celery.task import task @task(name='task1') def emailt(): print("email func invoked") # code... |
settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 正在运行。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 的问题。
DatabaseScheduler 是数据库调度器实现,不从
中获取任务
如果你打算使用这种类型的调度器,你应该通过 django admin 或通过数据迁移/视图创建 PeriodicTask
您可以通过创建 CrontabSchedule 并将其附加到 PeriodicTask
来使用任务中的默认调度程序或 DatabaseScheduler 的 crontab 表示法