Cerely框架-异步执行与定时任务
celery-处理大量的分布式系统,专注于实时处理的异步队列,也支持任务调度
celery的架构由三部分组成,消息中间件,任务执行单元和任务结果存储。
用户发起请求--->django(处理业务)--->消息中间件(rabbitmq,redis)--->celery--->消息存储
celery异步执行
首先保证消息中间件的启动,消费者定义的任务,然后监听,只需要一条命令
消费者怎么去发消息?生产者怎么去消费?
消费者:celery消费者这边的操作是,创建一个celery的对象,然后绑定消息中间件与异步的结果存储位置,然后给想要执行的方法上加上@cel.task
import celery
import time
backend='redis://127.0.0.1:6379/1' # 异步的结果存储位置
broker='redis://127.0.0.1:6379/2' # 消息中间件
cel = celery.Celery('test', backend=backend, broker=broker)
@cel.task
def send_email(name):
print("向%是发送邮件...."%name)
time.sleep(5)
print('向%s发送邮件完成'%name)
return 'ok'
# 终端启动命令:celery -A test worker -l info,
# 在 Celery 5.0 及更高版本中,-A 选项(用于指定 Celery 应用实例)不再是 worker 子命令的专属选项,而是成为了 全局选项。
# 正确的用法应该是将 -A 放在 celery 命令之后,worker 子命令之前。
生成者:消费者方法里面用了@cel.task,里面就会有delay方法,这个就会自动取连接消息中间件中创建好的队列,从消费这里把异步任务导入,使用delay,传入参数
# 首先从消费这里把异步任务导入
from test import send_email
# 消费者方法里面用了@cel.task,里面就会有delay方法,这个就会自动取连接消息中间件中创建好的队列
result = send_email.delay("yuan")
# 这里插入的一定是消费者哪里的函数(send_email),以及对应的参数(yuan),不能凭空捏造
异步取结果:
# 首先先从消费者哪里引入对象,还有引入AsyncResult
from celery.result import AsyncResult
from test import cel # 假设 test.py 中定义了 Celery 应用实例,通常命名为 app 或 cel
# 1. 构造 AsyncResult 对象
# id="shajbx1-ajsh-jhkj-knjknhub": 这是之前发送任务时返回的唯一任务ID
# app=cel: 这是你的 Celery 应用实例。AsyncResult 需要这个实例来知道如何连接到结果后端(backend)
# 以及消息代理(broker),从而正确地查询任务状态和结果。
async_result = AsyncResult(id="shajbx1-ajsh-jhkj-knjknhub", app=cel)
# 2. 检查任务状态
# async_result.successful():
# 这是一个便捷方法,用于检查任务是否已经成功完成。
# 如果任务的状态是 SUCCESS,则返回 True。
if async_result.successful():
# 3. 获取任务结果
# result = async_result.get():
# 如果任务成功,这个方法会从结果后端获取任务的返回值。
# 注意:如果任务尚未完成,`get()` 方法会阻塞当前线程,直到任务完成并返回结果。
# 在生产环境中,你可能需要考虑超时参数 `timeout`,或者在循环中不断检查状态而非直接 `get()`。
result = async_result.get()
print(result) # ok
# 4. 处理任务失败的情况
# async_result.failed():
# 这是一个便捷方法,用于检查任务是否已经失败。
# 如果任务的状态是 FAILURE,则返回 True。
elif async_result.failed():
# 这里可以获取失败的原因 (async_result.traceback)
# 或者打印错误信息 (async_result.info)
# ... 进行错误处理或日志记录
pass
celery定时任务
引入时间模块然后转换成时间戳,使用的是apply_async(args=[,], eta=时间戳)
多目录下完成定时任务
对celery配置文件加一个beat_schedule任务调度器,要在celery.py文件中写
celery.py 文件中配置了周期性任务(即使用 Celery Beat 调度器),那么除了启动 worker 之外,您还需要单独启动一个 Celery Beat 进程。
Celery worker 负责执行任务,而 Celery Beat 进程则负责 调度和发送周期性任务。
您需要在终端敲的命令是:
celery -A your_celery_app_module beat -l info
命令详解:
celery: Celery 命令的入口。
-A your_celery_app_module: 全局选项,指定您的 Celery 应用实例所在的模块。如果您的 Celery 应用实例在 celery.py 文件中,那么 your_celery_app_module 就是 celery (不带 .py 后缀)。
beat: 这是启动 Celery Beat 调度器的子命令。
-l info: 设置日志级别为 info,这样您可以在终端看到调度器的运行信息。
面试话术:
celery的异步执行就是让那些耗时任务不阻碍主任务的执行,去一边执行绑定中间件将消息存储,用于短信与邮件的发送。
Cerely框架-异步执行与定时任务的更多相关文章
- Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控
前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...
- Django+Celery 执行异步任务和定时任务
celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度.采用典型的生产者-消费者模型,主要由三部分组成: 1. 消 ...
- Celery+python+redis异步执行定时任务
我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会 ...
- Django配置celery执行异步任务和定时任务
原生celery,非djcelery模块,所有演示均基于Django2.0 celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线 ...
- 第六章并发编程,异步执行框架executor
异步执行框架executor是一个接口,只有一个方法.接受一个Runnable做为参数,执行任务. 将任务的执行与提交解耦. 1:executor package java.util.concurre ...
- Celery框架实现异步执行任务
Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/la ...
- celery执行异步任务和定时任务
一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件 ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- Celery的使用完成异步任务与定时任务
0917自我总结 Celery的使用 一.官方文档 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryp ...
- SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...
随机推荐
- HarmonyOS 实战:给笔记应用加防截图水印
最近在做笔记类应用时,遇到一个头疼的需求:防止用户内容被非法截图传播.思来想去,加水印是个直接有效的方案.研究了 HarmonyOS 的开发文档后,发现用 Canvas 配合布局组件能轻松实现动态水印 ...
- Springboot笔记<2>IOC容器与组件注入
IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装. 查看ioc容器中 ...
- 基于vis.js实现网络拓扑图等关系图谱
vis.js是一个动态的.基于浏览器的可视化库.该库被设计为易于使用,可以处理大量动态数据,并支持对数据的操作和与数据的交互.该库由组件DataSet, Timeline, Network, Grap ...
- mybatis下的ResultMap配置一对一以及一对多
一对一: 在数据库里面有这样的一个主外键关系的表: 我需要查找身份证的号码就要知道这个人的姓名(通过一个SQL语句要查到两个实体类里面的信息): SELECT c.*,p.* FROM idcard ...
- 深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
在多用户和高安全性要求的系统中,文件与目录权限控制是实现资源隔离与系统安全的基础机制.Linux 操作系统的文件权限模型提供了灵活强大的权限控制机制,通过对用户.组和其他用户的权限设置,确保系统资源的 ...
- 数据湖选型指南|Hudi vs Iceberg 数据更新能力深度对比
数据湖作为新一代大数据基础设施,近年来持续火热,许多前线的同学都在讨论数据湖应该怎么建,许多企业也都在构建或者计划构建自己的数据湖.基于此,自然引发了许多关于数据湖选型的讨论和探究.但是经过搜索之后我 ...
- Django(1)安装与基础使用
一.Django介绍 Django介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C. Django官方网站 Django官方文 ...
- MongoDB入门实战教程(11)
前面我们学习了在MongoDB中的写操作事务管理,本篇我们开始进入读操作事务. 1 读数据关注的两个问题 在通过mongodb读取数据时,我们一般需要关注两个问题: (1)从哪里读取? (2)什么样的 ...
- JAVA的Toolkit显示图片问题
Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/20220204.png" ...
- 【机器人】—— 1. ROS 概述与环境搭建
1. ROS 简介 1.1 ROS 诞生背景 机器人是一种高度复杂的系统性实现,机器人设计包含了机械加工.机械结构设计.硬件设计.嵌入式软件设计.上层软件设计....是各种硬件与软件集成,甚至可以说机 ...