celery笔记1

2024-08-27 21:20
文章标签 笔记 celery

本文主要是介绍celery笔记1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2 Celery介绍

2.1 Celery是什么

# 1 celery 是一个灵活且可靠的,处理大量消息的分布式系统,可以在多个节点之间处理某个任务-现在干一堆活,如果一个人,需要一件件来做-招了几个人,分别安排不同人干活-并发效果--》同时好多人在干活# 2 celery 是一个专注于实时处理的任务队列,支持任务调度# 3 celery 是开源的,有很多的使用者# 4 celery 完全基于 Python 语言编写# 5 celery 本质上是一个【分布式的异步任务调度框架】,类似于 Apache 的 airflow-分布式:可以运行在不同的计算机节点上-异步任务:同时干好多事-框架# 6 celery 只是用来调度任务的,但它本身并不具备存储任务的功能,而调度任务的时候肯定是要把任务存起来的。因此要使用 celery 的话,还需要搭配一些具备存储、访问功能的工具,比如:消息队列、Redis缓存、数据库等等。官方推荐的是消息队列 RabbitMQ,我们使用 Redis 同步调用函数---》add--》执行5s钟---》数据返回了
异步调用函数---》add---》执行了5s钟--》执行完的数据,找个地方存着
调用方--》去存的地方看一下--》任务有没有执行完消息队列:Rabbitmq,Kafkaredis:咱们用redis# 总结:-celery 分布式异步任务框架--》实现异步-需要有redis支持,这个框架才能用

2.2 Celery使用场景

# 1 异步任务(函数)-一些耗时操作交给celery执行-视频转码,邮件发送,消息推送# 2 定时任务-定时推送消息,定时爬取一些数据,定时统计一些数据等# 3 延迟任务-提交任务后,等一段时间再执行任务

2.3 Celery官网

# 1 开源软件
https://github.com/celery/celery
celery:芹菜,吉祥物# 2 文档地址
https://docs.celeryq.dev/en/stable/# 3 最新版本5.3.6版本 (小版更新bug)5.3版本软件版本命名规范:# 3 是大版本 跟 python 2有区别,有大更新# 3.6 版本到的代码基本一样# 3.6.1    3.6.2区别3.6.1上有bug,更新改正bug,再发版就叫 3.6.3python 3.6.8python 3.6.11python 3.9.1# 4 python的开源框架--》支持哪个版本及以上的python解释器5.3 ---》Python ❨3.8, 3.9, 3.10, 3.11# 5 集成到django中# 支持django 2.2.x 及以上   django 3.x 4.x 5.x 都可以# django低于 2.2 --》5.2.x # django 1 使用celery 4.xCelery 5.3.x supports Django 2.2 LTS or newer versions. Please use Celery 5.2.x for versions older than Django 2.2 or Celery 4.4.x if your Django version is older than 1.11.# 6 咱们讲课:-python:3.9.13          python 3.12-Django:3.2.22 版本 -celery:5.3

2.4 Celery架构

# Celery 架构,它采用典型的生产者-消费者模式,主要由以下部分组成:# Producer:它负责把任务(发送短信任务,爬虫任务)提交得到broker中
# celery Beat:会读取文件--》周期性的向broker中提交任务# broker:消息中间件,放任务的地方,celery本身不提供,借助于redis --》rabbitmq# worker:工人,消费者,负责从消息中间件中取出任务--》执行# backend :worker执行完,会有结果,结果存储在backend,celery不提供--》借助于 redis

在这里插入图片描述

3 Celery快速使用

3.1 安装

# 1 创建python项目-pycharm创建
# 2 创建虚拟环境--》解释器中,目前没有任何模块--》后续咱们需要装各种模块-pycharm创建# 3 安装celery
pip install celery# 4 安装redis
pip install redis# 5 如果win平台,需要装
pip install eventlet  # celery 是个小组织,它不支持win,借助于eventlet,可以运行在win上

在这里插入图片描述
在这里插入图片描述

3.3 redis安装和配置

#redis 安装和配置
Redis-x64-5.0.14.1.msi # redis安装包--》一路下一步安装完--》把redis装在你的电脑上了# mysql 一样的东西,存数据的地址resp-2022.1.0.0.exe# 客户端安装包--》一路下一步# 使用这个软件--》链接redis,图形化界面查看redis的数据# navicate一样的的东西# 启动redis-在服务中找到redis服务,启动# 链接redis操作-方式一(咱们不用):cmd中敲 redis-cli 链接    # mysql cmd 链接差不多-方式二:如下图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 使用

1-编写celery_demo.py

import timefrom celery import Celery# broker:消息中间件,使用redis
broker = 'redis://127.0.0.1:6379/1'# backend:结果存储,使用redis
backend = 'redis://127.0.0.1:6379/2'app = Celery('demo', broker=broker, backend=backend)# 编写任务
@app.task  # 被装饰器装饰了,才是celery的任务
def add(a, b):print('a+b的结束是:', a + b)time.sleep(1)  # 模拟任务耗时return a + b

2-提交任务–add_task.py

# 这个程序用来提交任务  producerfrom celery_demo import add# 1 同步调用
# res=add(7,8)
# print(res)# 2 异步--》使用delay来提交任务
# 这句话向消息队列中提交了一个任务,计算 7+8的任务,但是这个任务没执行       3d288ffa-e9ef-4816-8903-1eccd68b0d68
res = add.delay(45, 8)  # 没有1s耗时,直接返回,但是没有返回 15,而是返回了一个 uuid号
print(res)# 使用命令,启动worker--》worker会执行被提交的任务--》执行完后,会把结果存到redis的2库中
# 项目路径下执行:
# win:  celery -A celery_demo worker -l info -P eventlet
# mac linux:  celery -A celery_demo worker -l info

3-redis中可以看到被提交的任务-没执行
在这里插入图片描述

3-启动worker执行任务

# win:  celery -A celery_demo worker -l info -P eventletcelery -A 有app的py文件的名字 worker -l info -P eventlet# mac linux:  celery -A celery_demo worker -l info

在这里插入图片描述

4-任务被执行了–redis中看到的
在这里插入图片描述

4 Celery包结构

# 后期随着项目越来越大---》task任务越来越多,都写在一个py文件中,就不好了,希望把任务拆分到多个py文件中# 需要使用包结构来管理
项目名├── celery_task  	# celery包│   ├── __init__.py # 包文件│   ├── celery.py   # celery连接和配置相关文件,且名字必须叫celery.py│   └── crawl_task.py    # 所有任务函数└── order_task.py    # 所有任务函数└── user_task.py     # 所有任务函数├── add_task.py  	# 添加任务└── get_result.py   # 获取结果

4.1 创建包:celery_task

celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
# 任务分到不同的py文件中了
app = Celery('demo', broker=broker, backend=backend,include=['celery_task.crawl_task', 'celery_task.order_task', 'celery_task.user_task'])

**crawl_task.py **

import timefrom .celery import app@app.task
def crawl_baidu():print('====开始爬百度====')time.sleep(2)print('====爬完百度====')return '成功爬取!!'@app.task
def crawl_cnblogs():print('====开始爬cnblogs====')time.sleep(2)print('====爬完cnblogs====')return '成功爬取cnblogs!!'

order_task.py

import time
from .celery import app@app.task
def pay_order():print('====开始下单====')time.sleep(5)print('====下单完成====')return '成功下单!!'

**user_task.py **

import time
# . 表示当前路径
from .celery import app@app.task
def send_email(to='xxx@qq.com'):print('====邮件开始发送====')time.sleep(3)print('====邮件发送完成====')return '向%s发送邮件成功!!' % to

4.2 启动别的程序–提交任务–add_task.py

from celery_task.crawl_task import crawl_baidures = crawl_baidu.delay()  # crawl_baidu没有参数,这里就不传
print(res)  # uuid--》后续通过uuid查询结果是否执行完成  7a789046-4954-4918-b93e-2defc76adc02

4.3 提交的任务,没执行,放在redis中,可以去redis中看

4.4 启动worker执行任务

# 在包这一层执行,以包名运行
celery -A celery_task worker -l info -P eventlet# worker就会执行咱们提交的任务,执行完,会把结果放在redis中
# 手动去redis中看

4.5 使用代码查看结果get_result.py

# 1 拿到app
from celery_task.celery import app
from celery.result import AsyncResult
# 2 知道我们要查的任务 uuid
id = '7d396575-bfb7-45a5-8a0b-3a4767cde886'
if __name__ == '__main__':result = AsyncResult(id=id, app=app)if result.successful():result = result.get()print(result)elif result.failed():print('任务失败')elif result.status == 'PENDING':print('任务等待中被执行')elif result.status == 'RETRY':print('任务异常后正在重试')elif result.status == 'STARTED':print('任务已经开始被执行')

5 异步任务–延迟任务–定时任务

5.1 异步任务

# 咱们刚刚讲的就是在做异步任务res = 任务.delay(10, 20)

5.2 延迟任务

# 延迟5s钟给 xxx@qq.com 发邮件#######提交延迟任务 延迟5s钟给 xxx@qq.com 发邮件
# 创建一个5s时间对象
from celery_task.user_task import send_email
from datetime import datetime,timedelta
# datetime.utcnow()  默认时区用的utc时间,咱们也需要使用utc时间
# 后期我们会换成上海时间
# utc时间5s后的时间
eta=datetime.utcnow() + timedelta(seconds=5)
res=send_email.apply_async(args=['xxx@qq.com'],eta=eta)
print(res)# 启动worker
celery -A celery_task worker -l info -P eventlet
# worker收到后,不会立即执行,等5s后执行# 问题
如果延迟任务提交了,但是worker没启动,等10s后,worker才启动,worker也会执行任务,但是是立即执行# 后期worker会一直在运行,没有任务就阻塞,一般不会让它停掉,咱们这个问题一般不会出现# 加入只有一个worker,进来俩任务,串行执行,可以在多个机器上启动多个worker

5.3 定时任务

# 每隔5s钟,爬一次百度#1  celery.py中加入
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False# 任务的定时配置
from datetime import timedelta
app.conf.beat_schedule = {'low-task': {'task': 'celery_task.crawl_task.crawl_baidu','schedule': timedelta(seconds=5),'args': (), # crawl_baidu 没有参数,所以把不传}
}# 2 启动worker
celery -A celery_task worker -l debug -P eventlet# 3 启动beat
celery -A celery_task beat -l debug# 每隔5s,beat负责向broker提交一个任务--》worker执行任务

这篇关于celery笔记1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112815

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个