利用Django和Celery管理定时任务

这篇具有很好参考价值的文章主要介绍了利用Django和Celery管理定时任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


同步发表于个人站点: http://panzhixiang.cn/article/2023/3/16/68.html

一、背景介绍

我们以前一直使用k8s的cronjob来管理定时任务的。把定时任务相关的代码单独封装成一个pod,然后以cronjob的方法来触发。

虽然这个方法操作很简单,没有什么第三方资源的依赖(比如Redis),但是也有一个明显的缺点。

定时任务的代码脱离了Django代码,也就不能使用Django的很多功能了,只能通过DRF封装的API来跟Django的Server通信。
有的时候为了一个定时任务,要封装很多API,还要考虑鉴权等问题,也挺麻烦的,所以就在新项目中打算换一个方法来做定时任务的管理。

同时使用Python和Django的工程师估计基本都知道Celery,它是一个很好的异步任务框架。我上一次使用它还是2020年,发现这几年Celery的使用方法发生了一些变化,在网上找了一圈也没有找到很好的中文资料,所以自己写一篇相关的博客,希望能给以后需要查询相关信息的人提供一点帮助。

二、Celery配置

在配置Celery之前需要先安装,pip install celery, 接下来就开始配置了。

在正式开始介绍配置之前,我们需要一些假设,以便下面的文字可以表述的更清楚。

我们以django-admin startproject proj创建一个Django项目,Django版本应当>=3.0, 创建成功之后我们会得到如下的一个目录结构:

proj
├── manage.py
└── proj
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

熟悉Django的人应该对上面这个目录树非常熟悉,下面的内容都是基于这个目录树写的,所以需要记住这个目录树。

1. 定义Celery实例

为了定义Celery实例,需要在上面的目录树中创建一个文件: proj/proj/celery.py。
这个文件名是celery.py,跟settings.py在同一层目录。

内容如下,我把一些很重要的信息以注释的形式写在代码里了,注意查看。

import os
from celery import Celery


# 这个配置可以避免在其他的tasks.py中初始化django配置,虽然不是必须的,但是强烈建议要有这个配置
os.environ.setdefault(
    'DJANGO_SETTINGS_MODULE', 'proj.settings'
)

# 这个就是从环境变量中获取redis的地址,我这里使用redis作为broker
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost:6379')
app = Celery(
    'proj',  # 第一个参数是为celery的实例起了一个名字,这里叫做proj
    backend='redis://' + REDIS_HOST + '/1',
    broker='redis://' + REDIS_HOST + '/0',
)

# 可以用这个方法批量配置celery,
# 这几个配置在一帮的场景中就足够使用了
# 另外,其实还有几种其他方法来配置celery,但是我觉得这个方法对于不是非常大的项目来说就足够了。
app.conf.update(
    task_serializer='json',
    accept_content=['json'],  # Ignore other content
    result_serializer='json',
    enable_utc=True,
)

# 这一行会从django的settings文件中获取一些celery的配置
# namespace等于CELERY的意思是settings中以 “CELERY_” 开头的配置都会被识别为celery的配置
app.config_from_object('django.conf:settings', namespace='CELERY')

# 会自动发现所有Django app中的任务
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

除了上面这个配置,还有两个地方需要配。
首先是需要在proj/proj/__init__.py中添加以下内容:

from .celery import app as celery_app


__all__ = ('celery_app',)

它的作用是在启动Django的时候自动加载celery。

还有一个就是需要在django的settings中添加celery的配置,也就是上面代码中app.config_from_object('django.conf:settings', namespace='CELERY') 提到的部分。

CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60  # 单个任务的最大运行时间,单位是秒

2. 记录任务的结果

用celery做任务调度的时候可以最好能把每一次任务的结果记录下来,以便以后查阅,尤其是当任务没有按照预期运行的时候,这一点更加重要。

官网推荐使用django-celery-results做记录任务结果。

  1. 安装
    pip install django-celery-results
  2. 注册
    django-celery-results是一个单独的django的app,所以需要在settings.py注册一下
    INSTALLED_APPS = (
        ...,
        'django_celery_results',
    )
    
    注册之后还需要迁移数据库,
    python manage.py migrate django_celery_results
  3. 配置
    django-celery-results只是一个帮助自动存储任务结果的包,最终数据还需要一个地方落地,有很多地方都可以用来存储任务结果,比如数据库、本地文件系统,redis等等,我这里使用数据库,也比较推荐使用数据库。
    在django的setting.py中添加一下配置:
    CELERY_RESULT_BACKEND = 'django-db'  # 使用数据库做后端
    CELERY_CACHE_BACKEND = 'django-cache'  # 老实说,不知道这个缓存配置到底有什么作用,但是官网推荐使用这个配置,我也就留着了
    CELERY_CACHE_BACKEND = 'default'
    
  4. 启动
    注意这个命令要在第一层proj目录下运行,不然会报错,提示找不到配置文件之类的错误
    celery -A backend worker --loglevel=INFO
    

三、定时任务配置

前面介绍了怎么样配置celery,现在celery有了,要怎么来管理定时任务呢?这个时候就要用到django-celery-beat了,它的使用比较简单。

1. 配置django-celery-beat

  1. 安装
    pip install django-celery-beat
  2. 注册
    在django的settings.py中进行注册
    INSTALLED_APPS = (
        ...,
        'django_celery_beat',
    )
    
    同样,注册之后要迁移数据库,
    python manage.py migrate django-celery-beat
  3. 启动
    注意这个命令要在第一层proj目录下运行,不然会报错,提示找不到配置文件之类的错误
    celery -A proj beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    

想要单独说明的是,很多人在使用django_celery_beat做定时任务管理的时候,喜欢把定时任务以cronjob的形式封装在代码中,但是我比较喜欢通过Django Admin页面在数据库中进行配置。

因为封装在代码中,以后如果想要修改定时任务,就需要重新写代码然后部署到环境中,不太友好,而且对于非技术人员来说,想要自己配置定时任务的可能性几乎为零。

2. 通过Django Admin设置具体的定时任务

这一部分内容比较简单,把Django启动,登录到Admin页面之后通过页面点击创建即可,不难,但是想写出来要接很多图,就不是很想写了。

四、参考

  1. First Steps with Django
  2. Task result backend settings

欢迎关注我的公众号
文章来源地址https://www.toymoban.com/news/detail-726726.html

到了这里,关于利用Django和Celery管理定时任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker容器内的django启动celery任务队列

    celery任务队列一般要使用redis,但是容器内的django要访问本机的redis是十分麻烦的 在容器内安装redis,或者单独启动一个redis的容器,我是单独启动一个redis容器 安装redis镜像 docker pull redis 启动redis容器 docker run -d --name redis_container redis 查看redis的IP `docker inspect -f “{{range .Netwo

    2024年02月14日
    浏览(35)
  • Django框架-使用celery(一):django使用celery的通用配置,不受版本影响

    目录 一、依赖包情况 二、项目目录结构    2.1、怎么将django的应用创建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相关处理视图 4.1、基本配置 4.2、user的models 4.3、user的视图函数 五、

    2024年02月13日
    浏览(47)
  • celery笔记四之在Django中使用celery

    本文首发于公众号:Hunter后端 原文链接:celery笔记四之在Django中使用celery 这一篇笔记介绍一下如何在 Django 系统中使用 celery。 如果是想纯粹使用 celery,这一篇笔记可以略过。 本篇笔记目录如下: 文件配置 task 定义 运行 worker 我们这里使用前面的创建的 hunter Django 系统。

    2024年02月09日
    浏览(43)
  • Django使用Celery异步

    安装包 1.在项目文件的根目录下创建目录结果 2. 在main.py文件中  3.config.py文件 4.在项目后端文件下执行启动命令,即可,此时说明clery已经安装成功! 5.在task.py文件中将发送短信的任务注册到task中必须使用装饰器并在装饰器中设置别名便于区分 6.在视图函数中调用异步任务

    2024年02月22日
    浏览(45)
  • Django+Celery学习笔记

    Django+Celery学习笔记 DJANGO中使用CELERY实现定时任务(用DJCELERY) https://www.cnblogs.com/wumingxiaoyao/p/8521567.html Django中celery机制的使用总结 https://blog.csdn.net/Enjolras_fuu/article/details/108513357 代码 https://github.com/furuiyang0715/celery_learn 参考 https://www.celerycn.io/yong-hu-zhi-nan/canvas-she-ji-gong-zuo-liu-che

    2024年02月12日
    浏览(39)
  • django celery 记录

    django celery 记录 dvadmin-celery Django+Django-Celery+Celery的整合实战 https://cloud.tencent.com/developer/article/1445252 https://blog.csdn.net/wowocpp/article/details/131475484 https://docs.celeryq.dev/en/latest/django/first-steps-with-django.html https://docs.celeryq.dev/en/latest/django/index.html http://docs.celeryproject.org/en/latest/ https://

    2024年02月12日
    浏览(35)
  • Django+celery开启时报错

    django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread. The object with alias \\\'default\\\' was created in thread id 19767205568 00 and this is thread id 1976775359680. 问题: 执行celery worker -A s1 -l info -P eventlet能正常,放立即执行的任务(delay)没有问题,不过放apply_async的任务

    2024年02月11日
    浏览(43)
  • redis(其它操作、管道)、django中使用redis(通用方案、 第三方模块)、django缓存、celery介绍(celery的快速使用)

    1 redis其它操作 2 redis管道 3 django中使用redis 3.1 通用方案 3.2 第三方模块 4 django缓存 5 celery介绍 5.1 celery的快速使用

    2024年02月07日
    浏览(50)
  • django celery period 周期 例子

    django celery period 周期 例子 Django 借助 Celery 实现计划任务排期及调度系统(django-celery-beat) good https://www.jianshu.com/p/f22346379dbe https://django-celery-results.readthedocs.io/en/latest/ https://django-celery-beat.readthedocs.io/en/latest/ 五、运行测试 为了使系统正常运行,需要同时开启三个服务: web 服

    2024年02月12日
    浏览(42)
  • Django高级扩展之celery使用

    Celery是一个简单、灵活、可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列,同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置 创建celery 修改__init__ 开启celery 异步执行

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包