django celery admin 集成

对应版本:

Django==4.1.5
celery==5.3.5
redis==5.0.1
django-celery-beat==2.5.0
django-celery-results==2.5.1
flower==2.0.1

windows需要单独安装: eventlet==0.33.3

安装完成之后,settings文件中的INSTALLED_APPS中增加配置:

[
....,
    'django_crontab',
    'celery',
    'django_celery_results',
    'django_celery_beat',
]


继续增加celery和 celery_beat配置:



# 1、celery 配置

# BACKEND配置,可以选用redis或存放数据库
# CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'django-db'  # 存放至数据库
# Broker配置,使用Redis作为消息中间件
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'

CELERY_CACHE_BACKEND = 'default'  # 设置缓存为默认缓存,
CELERY_TASK_TRACK_STARTED = True  # 设置任务启动追踪
CELERY_TASK_TIME_LIMIT = 30 * 60  # 设置任务运行时间限制为30分钟
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# # 指定导入的任务模块,可以指定多个
CELERY_IMPORTS = (
   'application.tasks',
)

# celeryUtils 的启动工作数量设置
CELERY_WORKER_CONCURRENCY = 20
# 任务预取功能,就是每个工作的进程/线程在获取任务的时候,会尽量多拿 n 个,以保证获取的通讯成本可以压缩。
WORKER_PREFETCH_MULTIPLIER = 20
# 非常重要,有些情况下可以防止死锁
CELERYD_FORCE_EXECV = True
# celeryUtils 的 worker 执行多少个任务后进行重启操作
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
# 禁用所有速度限制,如果网络资源有限,不建议开足马力。
WORKER_DISABLE_RATE_LIMITS = True
# 明确指示在启动时进行连接重试
# BROKER_CONNECTION_RETRY_ON_STARTUP = True
BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True


# 2、celery_beat 配置
CELERY_TIMEZONE = 'Asia/Shanghai'  # celeryUtils 时区问题
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'


# 为存储结果设置过期日期,默认1天过期。如果beat开启,Celery每天会自动清除。
# 设为0,存储结果永不过期
# CELERY_RESULT_EXPIRES = xx
CELERY_TASK_RESULT_EXPIRES = 60*60*24  # 后端存储的任务超过一天时,自动删除数据库中的任务数据,单位秒
CELERY_MAX_TASKS_PER_CHILD = 1000  # 每个worker执行1000次任务后,自动重启worker,防止任务占用太多内存导致内存泄漏

配置文件当前目录下新增celery.py文件:

import os

from django.utils import timezone
import django
from django.conf import settings
from celery import platforms
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta


# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')

# app = Celery(f"application", broker=settings.BROKER_URL, backend=settings.RESULT_BACKEND)
celery_app = Celery(f"application")
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# celery_app.config_from_object(settings, namespace='CELERY')
# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
celery_app.autodiscover_tasks()
# platforms.C_FORCE_ROOT = True




# 解决时区问题,定时任务启动就循环输出
celery_app.now = timezone.now


@celery_app.task(bind=True)
def test_auto_discover():
    print("This task is registering successfully")


setting文件当前目录下的__init__.py文件下新增如下代码:

from .celery import celery_app

# from celery import celery_app as celery_app
__all__ = ("celery_app")

注意,这里是导入当前celery文件的app,不是celery包里面的,不然会导致admin那边发现不了已注册的任务

然后就可以在你应用下新增tasks.py 文件,就可以被自动发现, 内容大概如下:

from celery import shared_task


@shared_task
def wodewodewode():
    print("testcrontab:*************")

启动celery:

celery -A application worker -B --loglevel=info

也可以拆分成两个命令启动:

celery -A application worker --loglevel=info

celery -A application beat --loglevel=info

至此,所有配置完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值