python celery框架结合django的使用

学习目标:

通过文章了解celery的运行机制以及如何结合django去使用

  • 熟悉celery的运行原理
  • 属性celery在django项目当中的配置
  • 如何启动运行celery框架

学习内容:

  • 熟悉celery的运行原理,简单来说

Celery 是一个“任务排队机+后台处理器”。帮你把一些慢的、耗时的工作,丢到后台去异步处理,不影响用户继续正常使用网站。Celery内部又分为这些组件,任务的流转图如下,通常我们需要关注的就是定义任务,和生产任务投递到worker当中

组件名简单理解主要作用实现方式
Task(任务)要干的事情 定义要做的函数比如发邮件、跑批函数@shared_task或者 @app.task注解
Broker(消息中间件)传话的中介人 Django丢给Broker比如发邮件、跑批函数Redis对列或RabbitMQ对列
Worker(工人)真正干活的人 后台进程不停从队列拿任务,执行任务通过命令创建worker,celery -A myproject worker --loglevel=info启动一个worker,可以启用多个worker,进行并行并行处理,此时需要注意并行处理的数据安全
Result Backend(结果存储器)存储执行结果worker执行的结果需要存储通过Redis、关系型数据库都可以实现
Scheduler(调度器)生成任务并把任务存储起来将任务投递给 对应的消息中间件Broker当中常用的Celery Beat,同时可以解析cron表达式进行任务投递

请添加图片描述

  • 为什么要在django当中引入Celery?
    • Django本身是同步阻塞的,它不适合干很慢的活。 假设我们在处理用户注册时,需要调用给用户发送邮件的功能,但是这个功能处理又很耗时,如果都放在 Django 请求里同步跑,会出现什么问题?用户界面卡住,网页转圈圈、请求超时,服务器崩溃,这样用户的体验就会很差。
    • 另外一个重要的用途,我们的系统当中一般都有跑批定时任务,我们通过Celery可以很好的通过异步的方式处理这种跑批的操作。一般我们在系统当中引入Celery基于这种情况会比较多一些

如何在django项目当中配置celery

1. 安装 Celery 和 Redis
pip install celery
pip install redis
2. 在项目根目录(和settings.py同级)新建一个celery.py
# myproject/celery.pyimport os
from celery import Celery# 设置环境变量,指向你的Django设置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')# 创建Celery应用
app = Celery('myproject')# 从Django settings中加载Celery配置(以CELERY_开头)
app.config_from_object('django.conf:settings', namespace='CELERY')# 自动发现Django应用中的tasks.py文件
app.autodiscover_tasks()@app.task(bind=True)
def debug_task(self):print(f'Request: {self.request!r}')

如果我们使用了其他的名称,例如:customer_task.py,只要我们在内部方式使用了@shared_task(bind=True),一样是可以扫描到的,Celery启动的时候,会去你项目里所有安装的 Django App,自动查找能被发现的模块,只是默认是找tasks.py。

3. 修改__init__.py让 Django 启动时自动加载Celery,在myproject/init.py加上:
from .celery import app as celery_app__all__ = ('celery_app',)
4. 配置settings.py
# settings.py# 使用Redis作为broker
CELERY_BROKER_URL = 'redis://localhost:6379/0'# 存储任务结果(可选)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'# 配置序列化格式
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'# 时区设置
CELERY_TIMEZONE = 'Asia/Shanghai'  # 根据你的时区修改
5. 在你的 Django 应用中写tasks.py

比如你有个 app 叫myapp,在myapp/tasks.py或者custom_task.py里写任务:

# myapp/tasks.pyfrom celery import shared_task@shared_task
def test_print():print(f"now task is running")@shared_task
def send_email_task(email_address):# 假装这里发送邮件print(f"Sending email to {email_address}")
6. 启动 Celery Worker,启动完成后会打印启动日志和扫描到带@shared_task或者 @app.task注解的函数
celery -A myproject worker --loglevel=info # 启动一个worker

在这里插入图片描述

[tasks] 列表是Celery Worker扫描、注册成功的所有task 函数,当你定义的task函数在这里边就说明你的任务函数被扫描到了,但并不代理这个生产了可执行的任务此时我们如果不通过代码调用生产任务或者使用Scheduler组件生成任务投递到Broker当中,worker是拉取不到可执行的任务的。

7. 通过代码或者Scheduler组件投递任务
  • 调用方法的示例,上述我们定义了一个test_print方法,调用test_print.delay()就会生成一个任务投递到Broker当中
  • 定义一个cron表达式任务,启动Scheduler线程,生成任务
    # 不使用数据库示例
    from celery.schedules import crontabapp.conf.beat_schedule = {'clear-logs-every-night': {'task': 'myapp.tasks.test_print','schedule': crontab(minute='*/1'),  # 每分钟生成一个任务},
    }
    # 启动Scheduler线程,生产task任务投递到Broker当中
    celery -A myproject beat -l info
    
    启动完成后就可以在启动的Worker当中查看到任务的执行了,因为我起了两个Worker,所以任务并不是被一个Worker全部消费的。
    在这里插入图片描述

总结

通过上面的一系列的学习,我们就能够很清晰的了解了Celery框架的组成和使用原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滑动窗口leetcode 904

代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…

用可视化学习逆置法

1.逆置法思路 目标&#xff1a;将这个彩色数组向右旋转3步 &#x1f534;1 → &#x1f7e0;2 → &#x1f7e1;3 → &#x1f7e2;4 → &#x1f535;5 → &#x1f7e3;6 → ⚪7我们希望得到 &#x1f535;5 → &#x1f7e3;6 → ⚪7 → &#x1f534;1 → &#x1f7e0;…

Cisco Packet Tracer 选项卡的使用

目录 设备Config选项卡的使用 Realtime and Simulation模式&#xff08;数据包跟踪与分析&#xff09; 设备Desktop选项卡的使用 设备Config选项卡的使用 Hostname NVRAM Startup Config----Load 加载 INTERFACE 点击on Save 如果&#xff0c;不把Running Config保存为Sta…

pyqt写一个单片机配置界面

已经实现以下功能 1.可以选择单片机架构 2.选择完单片机架构后第二个框可以选择常见单片机型号 3.选择完常见单片机型号后第三个框可以选择内部资源如adc等&#xff08;可以选择多个内部资源&#xff09;4.选择完内部资源如adc等&#xff08;可以选择多个内部资源&#xff09;后…

丢失的数字 --- 位运算

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a; 268. 丢失的数字 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码实现 class Solution { public:int missingNumb…

千锋教育Ansible自动化运维实战教程从入门到精通

简介 介绍 Ansible 的基本概念、自动化运维优势、应用场景及课程目标。 欢迎开启 Ansible 学习之旅&#xff01; 你好&#xff01;作为一名学习者&#xff0c;你即将通过这个 Ansible 自动化运维实战 课程&#xff0c;从零开始掌握自动化运维的超能力&#xff01;这个“简介”…

深入理解 TensorFlow 的模型保存与加载机制(SavedModel vs H5)

深入理解 TensorFlow 的模型保存与加载机制&#xff08;SavedModel vs H5&#xff09; 在使用 TensorFlow 进行模型训练后&#xff0c;模型的保存与加载是部署、复用和迁移学习的重要环节。TensorFlow 提供了两种主要的保存格式&#xff1a;SavedModel 和 HDF5 (.h5)。本篇文章…

C++之特殊类设计及类型转换

目录 一、设计一个不能被拷贝的类 二、设计一个只能在堆上创建对象的类 三、设计一个只能在栈上创建对象的类 四、设计一个不能被继承的类 五、设计一个只能创建一个对象的类(单例模式) 六、C语言中的类型转换 七、C中的三类类型转换 八、C强制类型转换 8.1、为什么C需…

制作一款打飞机游戏36:调度编辑器

我们正在创建一个调度编辑器。嗯&#xff0c;这个名字听起来可能有点奇怪&#xff0c;对吧&#xff1f;但如果你了解射击游戏中的“调度”&#xff0c;那就是敌人出现的时间表。 你可能已经看到了&#xff0c;我们有一个可以滚动的关卡。现在&#xff0c;我想增加一些交互性&a…

wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API

【2.17最新版】Linkreate wordperss AI插件&#xff1a;AI图文视频长尾关键词自动生成&#xff0c;已内置deepseek、kimi全模型。 支持自定义接入其它API&#xff0c;包括但不限于腾讯云API和它的deepseek模型 后台只需要设置对应的API url 、模型 、API key,就可以让插件调用…

从零开始学Python:开启编程新世界的大门

在当今数字化时代&#xff0c;Python作为一门简洁、高效且功能强大的编程语言&#xff0c;受到了越来越多人的喜爱与追捧。无论是数据科学、人工智能、Web开发&#xff0c;还是自动化脚本编写&#xff0c;Python都展现出了卓越的能力。本文将带领大家踏上Python学习之旅&#x…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 缺失值检测与处理全攻略&#xff1a;NULL值填充与删除策略实战3.2 缺失值检测与处理3.2.1 缺失值类型与业务影响3.2.1.1 缺失值的三种形态3.2.1.2 业务影响分级 3.2.2 缺失值…

Java求职面试:Spring Boot与微服务的幽默探讨

Java求职者面试&#xff1a;技术与幽默的碰撞 场景概述 在某互联网大厂的面试现场&#xff0c;面试官严肃认真&#xff0c;程序员则是一个搞笑的水货角色。面试者名叫张伟&#xff0c;年龄28岁&#xff0c;硕士学历&#xff0c;拥有5年的Java开发经验。以下是面试的详细过程。…

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中&#xff0c;对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外&#xff0c;最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…

map和set的设计以及红黑树的设计

1.map和set的底层是红黑树 2.map和set在STL是容器&#xff0c;在我看来&#xff0c;不过也是封装了平衡二叉搜索树红黑树的适配器 我们先看红黑树的设计&#xff0c;看完后map和set的封装易如反掌 #pragma once #include<utility> #include<iostream> using name…

Linux运维——Vim技巧二

Vim技巧 一、管理多个文件1.1、用缓冲区列表管理打开的文件1.2、用参数列表将缓冲区分组1.3、将工作区切分成窗口1.4、用标签页将窗口分组1.5、用:edit命令打开文件1.6、使用:find打开文件1.7、把文件保存到不存在的目录中 二、动作命令在文档中移动2.1、区分实际行与屏幕行2.2…

2025 年 408 真题及答案

2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题&#xff0c;符号栈…

【MuJoCo仿真】开源SO100机械臂导入到仿真环境

主要参考&#xff1a;https://github.com/jpata/gym-so100/tree/integration/gym_so100/assets/trs_so_arm100 参考&#xff1a;&#xff08;八&#xff09;lerobot开源项目扩展so100的仿真操控&#xff08;操作记录&#xff09;_so100机械臂 仿真-CSDN博客 下载&#xff1a;…

Socat 用法详解:网络安全中的瑞士军刀

Socat 用法详解&#xff1a;网络安全中的强大工具 引言 socat&#xff08;SOcket CAT&#xff09;是一款功能强大的命令行工具&#xff0c;被誉为“网络瑞士军刀”&#xff0c;广泛应用于数据传输、端口转发和网络调试等场景。它支持多种协议和数据通道&#xff08;如文件、管…

永磁同步电机控制算法--基于PI和前馈的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…