第一个带有 Celery 的 Django cron
Posted
技术标签:
【中文标题】第一个带有 Celery 的 Django cron【英文标题】:First Django cron with Celery 【发布时间】:2019-07-02 14:10:06 【问题描述】:我阅读了很多关于Celery
和Django
的文档,并尝试创建我的第一个cron task
。
目标:
这个任务应该能够在每天上午 11:30 执行一个清理特定表的函数
我的代码:
一切似乎都很好,我在 Celery 中看到了任务,但没有任何改变。
我的 base.py 文件中有:
INSTALLED_APPS = (
....
'django_cron',
)
CRON_CLASSES = [
"app.cron.cron.DeleteOldToken",
]
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False
CELERY_TASK_TRACK_STARTED = True
# Add a one-minute timeout to all Celery tasks.
CELERYD_TASK_SOFT_TIME_LIMIT = 60
我有一个 celery.py 文件:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main.settings.base')
app = Celery('main')
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
我有一个 cron.py 文件:
# -*- coding: utf-8 -*-
from django_cron import CronJobBase, Schedule
from ..tasks import delete_old_token
class DeleteOldToken(CronJobBase):
RUN_AT_TIMES = ['11:30']
schedule = Schedule(run_at_times=RUN_AT_TIMES)
code = 'app.delete_old_token'
def do(self):
delete_old_token()
还有文件 tasks.py:
# -*- coding: utf-8 -*-
import datetime
from datetime import datetime
from celery import shared_task, task
from dateutil.relativedelta import relativedelta
from django.conf import settings
from token_jwt.models import UserToken
@task()
def delete_old_token(self):
for token in UserToken.objects.exclude(date_information__isnull=True):
tdi = token.date_information
if datetime(tdi.year, tdi.month, tdi.day) < datetime.now() + relativedelta(months=2):
token.delete()
命令:
然后我尝试启动这个命令:
celery -A main worker --loglevel=info
它显示:
-------------- celery@pydev-jungbluth v4.2.1 (windowlicker)
---- **** -----
--- * *** * -- Linux-4.15.0-45-generic-x86_64-with-debian-buster-sid 2019-02-08 11:29:10
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: main:0x7fd4befe5cf8
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: redis://localhost:6379/
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. app.tasks.delete_old_token
[2019-02-08 11:29:10,889: INFO/MainProcess] Connected to redis://localhost:6379//
[2019-02-08 11:29:10,894: INFO/MainProcess] mingle: searching for neighbors
[2019-02-08 11:29:11,914: INFO/MainProcess] mingle: all alone
[2019-02-08 11:29:11,920: INFO/MainProcess] celery@pydev-jungbluth ready.
但什么也没有出现。看来我的 cron 任务不起作用或没有执行。
你有什么想法吗?
编辑:
芹菜节拍给了我:
$ celery -A main beat
celery beat v4.2.1 (windowlicker) is starting.
__ - ... __ - _
LocalTime -> 2019-02-08 12:03:22
Configuration ->
. broker -> redis://localhost:6379//
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%WARNING
. maxinterval -> 5.00 minutes (300s)
【问题讨论】:
Runbeat
它检查要执行哪个任务时间。
$ celery -A proj beat
跑芹菜节拍
我用celery beat
添加了编辑部分
【参考方案1】:
django-cron
不与celery
交互。如果你想让 celery 在预定的时间运行作业,你想使用django-celery-beat
。 Django celery beat 将允许您通过 django 管理面板设置您的 cron 作业时间表。当您使用它时,您必须修改您的 celery beat 以从以下选项开始:
--scheduler django_celery_beat.schedulers:DatabaseScheduler
完整设置步骤可见here。
【讨论】:
以上是关于第一个带有 Celery 的 Django cron的主要内容,如果未能解决你的问题,请参考以下文章
Django + Celery:如何将带有参数的任务链接到周期性任务
Django - Celery - supervisord 日志配置
Django-celery 和 RabbitMQ 不执行任务
Django 模型没有保存到 Celery Task 中的数据库中
创建第一个 Celery 任务 - Django。错误 - “错误/MainProcess] 消费者:无法连接到 amqp://guest:**@127.0.0.1:5672//:”