使用django_celery_beat在admin后台配置计划任务

一、依赖包的安装

django中使用celery做异步任务和计划任务最头疼的点就是包之间版本兼容性问题,项目一启动花花报错,大概率都是版本问题。每次都会花很大时间在版本兼容性问题上。本例使用如下版本:

Django==3.2

celery==5.2.7

django-celery-beat==2.2.1

django-celery-results==2.4.0

django-redis==4.11.0

redis==3.5.3

如果是其他版本的django且有兼容性问题,推荐一个工具pipdeptree,这玩意可以清晰展示包间依赖关系和版本冲突,很方便。

二、主要配置

setting.py:

INSTALLED_APPS = [
    'django_celery_results',
    'django_celery_beat',
]

tasks.py:

from itom_service.celery_app import app, logger

@app.task()
def print_123(**kwargs):
    logger.info('开始打印')
    print(kwargs)

celery_app.py:

import os

from celery.schedules import crontab
from celery.utils.log import get_logger
from django.conf import settings

from kombu import Queue, Exchange
from celery import Celery

logger = get_logger('celery')

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'itom_service.settings.settings')

app = Celery('celery', broker=settings.CELERY_BROKER_URL, backend=settings.CELERY_RESULT_BACKEND)
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.conf.update(
    # enable CELERY_ALWAYS_EAGER=True can debug you tasks
    # CELERY_ALWAYS_EAGER=True,
    CELERY_TASK_RESULT_EXPIRES=None,  # 任务结果永不过期
    CELERY_TASK_SERIALIZER='json',
    CELERY_ACCEPT_CONTENT=['json'],
    CELERY_RESULT_SERIALIZER='json',

    CELERYD_CONCURRENCY=10,
    CELERYD_FORCE_EXECV=True,
    CELERYD_MAX_TASKS_PER_CHILD=100,

    CELERY_DEFAULT_QUEUE='default',
    CELERY_DEFAULT_ROUTING_KEY='default',
    CELERY_QUEUES=(
        Queue('default', Exchange('default'), routing_key='default'),
        Queue('demo_queue', Exchange('demo_queue'), routing_key='demo_queue'),
    ),
    # TIME_ZONE = 'Asia/Shanghai'
    CELERY_TIMEZONE=settings.TIME_ZONE,
    # 关键配置:配合django_celery_beat使用,admin配置的定时任务可以被顺利执行
    CELERYBEAT_SCHEDULER='django_celery_beat.schedulers:DatabaseScheduler', 
    
    # 这配置的计划任务会被自动同步到数据库,可以在admin后台进行编辑
    CELERYBEAT_SCHEDULE={
        # schedule1:execute tasks every five minutes(sync_host)
        'sync_host': {
            "task": "itom_service.apps.user.tasks.print_123",
            "schedule": crontab(minute='*/1'),
            "args": (),
            "kwargs": {'key': '这是写死的定时任务'}
        },
    }
)

三、启动worker、beat

celery -A itom_service.celery_app worker  -l info

celery -A  itom_service.celery_app  beat   -l info

四、admin配置定时任务

很灵活的玩法。 

错误处理:

admin中查看任务结果报错:ValueError: Database returned an invalid datetime value. Are time zone definitions for your database installed?

解决:

Raise database error when enable USE_TZ=True · Issue #224 · celery/django-celery-results · GitHub

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值