Django 如何使用 Celery 完成异步任务或定时任务

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

以前版本的 Celery 需要一个单独的库(django-celery)才能与 Django 一起工作, 但从 Celery 3.1 开始,情况便不再如此,我们可以直接通过 Celery 库来完成在 Django 中的任务。

安装 Redis 服务端

以 Docker 安装为例,安装一个密码为 mypassword 的 Redis 服务端

docker run -itd --name redis -p 127.0.0.1:6379:6379 redis:alpine redis-server --requirepass mypassword

在 Python 中安装 Celery 和 Redis

pip install celery redis

在 Django 项目中添加 Celery 配置

在 Django 项目中创建一个 celery.py 文件,并配置 Celery 应用程序。这个文件应该与 settings.py 文件位于同一目录下:

import os

from celery import Celery

# 设置 Django 的默认环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')

# 使用 Django 的 settings.py 文件配置 Celery
app.config_from_object('django.conf:settings', namespace='CELERY')

# 从所有已安装的应用中自动发现并加载任务模块
app.autodiscover_tasks()

然后在 settings.py 文件中添加配置:

# 使用 Redis 作为消息代理(broker)来传递任务消息,连接地址为 localhost:6379/0,并提供密码 mypassword 进行身份验证。
CELERY_BROKER_URL = 'redis://:mypassword@localhost:6379/0'

# 使用 Redis 作为结果存储后端,连接地址同上,使用相同的密码进行身份验证。
CELERY_RESULT_BACKEND = 'redis://:mypassword@localhost:6379/0'

# 指定发送到代理(broker)的任务消息序列化格式为 JSON 格式。
CELERY_TASK_SERIALIZER = 'json'

# 指定从结果后端获取的结果序列化格式为 JSON 格式。
CELERY_RESULT_SERIALIZER = 'json'

# 指定支持接收的内容类型为 JSON 格式。
CELERY_ACCEPT_CONTENT = ['json']

# 将时区设置为亚洲/上海时区。
CELERY_TIMEZONE = 'Asia/Shanghai'

# 启用 UTC 时间。
CELERY_ENABLE_UTC = True

再在 __init__.py 文件(与 settings.py 同级)中添加以下内容:

from .celery import app as celery_app

__all__ = ('celery_app',)

在 Django 应用程序中创建一个 tasks.py 文件,并编写要运行的任务函数。例如,此处我们将编写一个名为 send_email() 的任务,来定期发送电子邮件:

from django.core.mail import send_mail
from celery import shared_task

@shared_task
def send_email():
    # 发送电子邮件的代码
    pass

如果想要实现异步任务的功能,在 Django 项目中的任何位置调用任务函数即可。例如,在 views.py 文件中,我们可以从视图函数中启动任务,如下所示:

from myapp.tasks import send_email

def my_view(request):
    send_email.delay()
    return HttpResponse('任务已经在后台执行。')

如果想要实现定时任务的功能,可以在 Celery 的配置文件中设置定时任务的调度方式。例如,要每小时运行一次 send_email() 任务,我们可以添加以下代码:

from celery.task.schedules import crontab

app.conf.beat_schedule = {
    'send-email-every-hour': {
        'task': 'myapp.tasks.send_email',
        'schedule': crontab(minute=0, hour='*/1'),
    },
}

定时任务的具体写法可以参考官方文档:https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=crontab

运行 Celery-worker 与 Celery-beat

Celery是一个分布式任务队列,由三个主要组件组成:Celery worker、Celery beat 和消息代理(例如 Redis 或 RabbitMQ)。这些组件一起协作,让开发者能够轻松地执行异步任务和定时任务。

Celery worker:负责接收任务请求并执行任务。当您在 Django 应用程序中调用 apply_async 方法时,任务将被发送到 Celery worker,然后由 worker 执行。

Celery beat:负责调度定时任务。它会根据定义的规则定期触发任务,并将其发送到 Celery worker 处理。

所以,对于需要运行定时任务的情况,我们需要同时启动 Celery worker 和 Celery beat 进程来确保所有任务都可以被正确地处理和执行。

如果只需要使用 Celery 来执行异步任务,那么只需启动 Celery worker 即可。但如果需要周期性地执行任务,那么需要启动 Celery beat 来帮助完成调度这些任务。

# 运行 worker 与 beat
celery -A proj worker --loglevel=info --detach --pidfile=worker.pid --logfile=./logs/worker.log
celery -A proj beat --loglevel=info --detach --pidfile=beat.pid --logfile=./logs/beat.log
  • -A proj:指定 Celery 应用程序所在的模块或包,这里假设其名为 proj。
  • worker 或 beat:启动的进程名称,分别对应 worker 和 beat 两种类型的 Celery 进程。
  • --loglevel=info:设置日志级别为 info,即只记录 info 级别及以上的日志信息。
  • --detach:以守护进程(daemonized)方式启动 Celery 进程,使其在后台运行。
  • --pidfile=worker.pid 或 --pidfile=beat.pid:将进程 ID(PID)写入指定的 PID 文件,方便后续管理和监控。
  • --logfile=./logs/worker.log 或 --logfile=./logs/beat.log:指定日志文件路径,所有日志信息都会输出到该文件中。

随后我们设定的定时任务便会按规则执行,可以通过指定的日志文件查看执行结果。当我们需要停止 Celery worker 与 Celery beat 时,可以执行以下操作:

kill -TERM $(cat worker.pid)
kill -TERM $(cat beat.pid)

参考

[1] [Using Celery with Django]: https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#using-celery-with-django
[2] [Periodic Tasks]: https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=crontab文章来源地址https://www.toymoban.com/news/detail-424879.html

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

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

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

相关文章

  • Django使用Celery异步

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

    2024年02月22日
    浏览(30)
  • Django(21):使用Celery任务框架

    Django Web项目中我们经常需要执行耗时的任务比如发送邮件、调用第三方接口、批量处理文件等等,将这些任务异步化放在后台运行可以有效缩短请求响应时间。另外服务器上经常会有定时任务的需求,比如清除缓存、备份数据库等工作。Celery是一个高效的异步任务队列/基于

    2024年02月07日
    浏览(28)
  • 如何在Django中使用django-crontab启动定时任务、关闭任务以及关闭指定任务

    安装django-crontab包: 在Django项目的settings.py文件中,找到INSTALLED_APPS配置,并添加\\\'django_crontab\\\'到列表中: 在settings.py文件的末尾,添加以下配置以设置定时任务的时间间隔: 假设我们有一个名为myapp的应用,其中定义了task1、task2和task3三个定时任务。具体参数设置看这里 在终端中

    2024年02月09日
    浏览(33)
  • 分布式异步任务框架celery

    Celery是一个基于消息中间件的分布式任务队列框架,专门用于处理异步任务。它允许生产者发送任务到消息队列,而消费者则负责处理这些任务。Celery的核心特性包括异步执行、实时操作支持以及强大的调度能力,使其每天可以处理数以百万计的任务。 在Celery中,任务是以

    2024年04月10日
    浏览(36)
  • python 异步任务框架 Celery 入门,速看!

    Celery 是使用 python 编写的分布式任务调度框架。 它有几个主要的概念: celery 应用 用户编写的代码脚本,用来定义要执行的任务,然后通过 broker 将任务发送到消息队列中 broker 代理,通过消息队列在客户端和 worker 之间进行协调。 celery 本身并不包含消息队列,它支持一下消

    2024年02月13日
    浏览(29)
  • celery分布式异步任务队列-4.4.7

    version 4.4.7 学习总结 python实现、开源、遵循BSD许可的分布式任务队列; 可以处理大量消息,简单、灵活、可靠的分布式系统,专注任务的 实时处理 和 定时调度 处理; 它是线程、进程分配任务的一种机制,官方仅做支持linux开发。 五大部分: task,任务 beat,定时调度管理器

    2024年02月07日
    浏览(30)
  • Django框架使用定时器-APScheduler实现定时任务:django实现简单的定时任务

    系统:windows10 python: python==3.9.0 djnago==3.2.0 APScheduler==3.10.1 1、创建utils包,在包里面创建schedulers包 utils/schedulers/task.py utils/schedulers/scheduler.py utils/schedulers/__init__.py 2、项目配置文件settings.py

    2024年02月12日
    浏览(30)
  • celery笔记八之数据库操作定时任务

    本文首发于公众号:Hunter后端 原文链接:celery笔记八之数据库操作定时任务 前面我们介绍定时任务是在 celery.py 中的 app.conf.beat_schedule 定义,这一篇笔记我们介绍一下如何在 Django 系统中的表里来操作这些任务。 依赖及migrate操作 beat 的启动 表介绍 手动操作定时任务 我们先

    2024年02月11日
    浏览(34)
  • celery笔记七之周期/定时任务及crontab定义

    本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或者每隔半小时运行一遍该函数,都是这种任务的范畴。 在第一篇笔记的时候我们就介绍过 celery 的组

    2024年02月10日
    浏览(21)
  • 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日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包