celery笔记1

news2024/11/14 14:54:50

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,Kafka

redis:咱们用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.3
        python 3.6.8
        python 3.6.11
        python 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.x
	Celery 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 time

from 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

# 这个程序用来提交任务  producer

from 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 eventlet

celery -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 Celery

broker = '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 time

from .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_baidu

res = 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执行任务

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

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

相关文章

如何评估超低排放除尘器的长期运行成本和维护成本?

评估超低排放除尘器的长期运行成本和维护成本涉及多个方面,朗观视觉小编认为,以下是一些关键因素: 初始投资成本:首先考虑设备的购买成本,包括除尘器本身及其所有必要的配件和安装费用。 能源消耗:评估除尘…

智能楼层导视软件:提升楼宇导航体验的技术解决方案

亲爱的技术爱好者、开发者及楼宇管理者们,您是否曾为大型建筑内复杂多变的楼层布局而烦恼?是否希望为访客和员工提供更加直观、高效的导航服务?今天,我们向您介绍我们的最新产品——楼层导视软件,一款专为解决现代楼宇…

全渠道营销:SaaS行业的制胜之道

1. 什么是全渠道营销 全渠道营销(Omnichannel Marketing)是一种综合性的营销策略,旨在通过整合多个线上和线下渠道,实现销售和品牌推广的目标。这种策略强调在不同渠道间提供一致的品牌体验和无缝的过程,确保消费者在…

ssm 汽车的销售平台---附源码96800

目 录 摘 要 1 绪论 1.1 研究背景与意义 1.2研究开发现状分析 1.3主要研究内容 1.4论文章节安排 2 相关技术介绍 2.1Web编程语言 2.2 MySQL数据库 2.3 SSM框架介绍 3 系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 市场可行性分析 3.1.3 操作可行性分析…

上半年首次扭亏为盈,极兔中报背后藏着超预期成长潜力

快递行业的“黑马”极兔速递,如今跑出了新成绩。在近日公布的2024年中期业绩中,其上半年收入达到48.62亿美元,同比增长20.6%,领跑整个快递行业。 更令人眼前一亮的是利润,极兔上半年净利润首次转正为3102.6万美元&…

打造敏捷开发环境:JNPF低代码平台的实践与探索

在数字化转型的浪潮中,企业对软件开发的敏捷性和效率提出了更高的要求。传统的软件开发模式通常耗时长、成本高昂,难以迅速适应市场变化。低代码平台的出现,为解决这一问题提供了新的视角。本文将探讨如何运用JNPF低代码平台构建敏捷开发环境…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议,该协议可以有效防止远程管理过程中的信息泄漏,是西安传输数据加密,能够防止DNS和IP欺骗,传输数据压缩,加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段,该协…

CentOS7 mysql-cluster安装与配置

目录 下载安装: #拷贝ndb_mgm和ndb_mgmd #创建并编辑配置文件 #初始化管理节点 安装数据节点和sql节点 #初始化mysql #启动mysql #登录并设置新密码 #启动ndbd节点: #启动和停止管理节点 mysql-cluster安装与配置 下载安装: 下载工具包地址:https://dev.m…

JAVA毕业设计165—基于Java+Springboot+vue3的二手房交易管理系统(源代码+数据库+11000字论文)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的二手房交易管理系统(源代码数据库11000字论文)165 一、系统介绍 本项目前后端分离(还有ssm版本),分为用户、卖家、管理员三种角色 1、用户&a…

基于SSM的零食商城系统

1.项目介绍 基于SSM的零食商城系统,前端采用Bootstrap框架。 后台采用经典SSM框架。数据库采用MySQL。 包括用户前台和管理后台,后台管理又可以分为店员(或客服)和超级管理员, 会员可以通过商城门户进行查看商品、选…

N5171B EXG X 系列射频模拟信号发生器,9 kHz 至 6 GHz

N5171B 射频模拟信号发生器 产品综述 N5171B EXG X 系列中档性能射频模拟信号发生器可以提供 9 kHz 至 6 GHz 的频率范围,并针对制造测试进行了优化,具有更快的吞吐量、更长的正常运行时间以及适合的价格。 功能特点 ◆ ◆出色的硬件性能有助于最大…

朵拉朵尚和法国著名药企原料商Seqens正式签约建立战略合作

共探美丽新未来 朵拉朵尚和法国著名药企原料商Seqens正式签约建立战略合作 当前,正值全球生物医药产业爆发式增长的时期,在追求自然与科学完美融合的美丽征程中,国内知名护肤品牌朵拉朵尚再次迈出坚实步伐,与享誉全球的法国药企原…

Linux下qt程序缺少中文字库,中文显示为框框

现象 Linux下qt5.9编译程序,运行时候界面上的中文显示一个一个的框框。 如图 原因 开发板里缺少中文字库或者qt字库环境未正常配置导致的。 解决方法一: 如果系统中存在中文字库,一般是在/usr/share/下有一个fonts文件夹 配置qt中文字库路…

基于信号量和环形队列的生产者消费者模型

文章目录 POSIX信号量信号量接口初始化信号量销毁信号量等待信号量发布信号量 基于环形队列的生产者消费者模型单生产单消费多生产多消费 POSIX信号量 POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以…

网络安全之渗透测试实战-DC-3-靶机入侵

一、下载靶机DC-3,解压后导入Vmware Workstation https://pan.baidu.com/s/17BcSH6RqC7wuyB7PRNqOow?pwdkc12启动DC-3靶机,由于不知道密码,无需登录 二、靶机的网卡采用的是NAT模式自动获取IP地址,此时我们需要先获取其MAC地址…

黑神话悟空火到RD集体请假?文心快码助你速通游戏!

近期,一款名为《黑神话:悟空》的游戏席卷了朋友圈,以其独特的西游背景、引人入胜的剧情和极致的游戏体验,让众多玩家沉迷其中,欲罢不能。然而,这场“悟空风暴”也给我们的RD(研究开发人员&#…

分贝通海外卡全新升级,引领企业全球支出管理新潮流

随着中国企业不断拓展海外市场,境外资金管理成为企业国际化进程中的一大挑战。面对复杂的国际金融环境和多变的汇率风险,企业迫切需要一个高效、安全、便捷的资金管理工具。 分贝通,全新升级海外卡,企业境外资金管理和安全保驾护航。 境外资金管理的痛点 1.汇率波动风险:国际…

Shell条件测试、if语句、case分支语句

目录 一、条件测试 1. 条件测试操作 2.test 命令 3.文件测试 4.字符串比较 5.逻辑测试 二、if语句 1.单分支结构 2. 双分支结构 3.多分支结构 三、case语句 1.case结构 一、条件测试 1. 条件测试操作 Shell环境根据命令执行后的返回状态值($?)来…

C++学习笔记——求整数的和与均值

一、题目描述 二、代码 #include <iostream> #include<iomanip>using namespace std;int main() {int n;cin >> n;double a[n];for(int i0;i<n;i){cin >> a[i];}double num 0;for(int i0;i<n;i){num num a[i];}double result num / n;cout &…

dotpeek反编译dll导出代码

安装dotpeek github 官网 加载dll 导出 问题 去掉特性即可&#xff0c;安装mono.cecil using Mono.Cecil; using System;namespace DelSuppressIldasmAttribute {internal class Program{static void Main(string[] args){var input "xxxx.dll";var output &qu…