celery介绍和安装 celery快速使用 celery包结构

celery介绍和安装

celery是什么:

是一个框架,一个服务,属于python的框架,跟Django无关。

功能:

  • 1.异步功能
  • 2.定时任务
  • 3.延迟任务

理解celery的运行原理

1.可以不依赖任何服务器,通过自身命令,启动服务

2.celery服务为其他项目服务提供异步解决任务需求的。

PS:它会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求

举例:人是一个独立运行的服务 | 医院也是一个独立运行的服务

正常情况下,人可以完成所有健康的动作,不需要医院的参与。但当人生病时,就会被医院接收,解决人生病问题

人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求

celery架构(Broker,backend都用redis):

	- 1 任务中间件 Broker(中间件),其他服务提交的异步任务,放在里面排队
    	-需要借助于第三方 redis   rabbitmq  
  - 2 任务执行单元 worker     真正执行异步任务的进程
    	-celery提供的
  - 3 结果存储   backend     结果存储,函数的返回结果,存到 backend中 
    	-需要借助于第三方:redis,mysql

使用场景:

  • 异步执行:解决耗时任务

  • 延迟执行:解决延迟任务

  • 定时执行:解决周期任务

celery 不支持win,通过eventlet支持在win上运行

celery快速使用

# 安装---》安装完成,会有一个可执行文件 celery
	pip install celery
    win:pip install eventlet

    
# 快速使用
######### 第一步:新建 main.py######### 
from celery import Celery
# 提交的异步任务,放在里面
broker = 'redis://127.0.0.1:6379/1'
# 执行完的结果,放在这里
backend = 'redis://127.0.0.1:6379/2'
app = Celery('test', broker=broker, backend=backend)
@app.task
def add(a, b):
    import time
    time.sleep(3)
    print('------',a + b)
    return a + b

######### 第二步:其他程序,提交任务######### 
res = add.delay(5,6)   #原来add的参数,直接放在delay中传入即可
print(res)  # f150d8a5-c955-478d-9343-f3b60d0d5bdb


### 第三步:启动worker
# 启动worker命令,win需要安装eventlet
	win:
       -4.x之前版本
		celery worker -A main -l info -P eventlet
       -4.x之后
    	celery  -A main  worker -l info -P eventlet
	mac:
       celery  -A main  worker -l info
        
        
### 第四步:worker会执行消息中间件中的任务,把结果存起来####


### 第五步:咱们要看执行结果,拿到执行的结果#####
from main import app
from celery.result import AsyncResult
id = '51611be7-4914-4bd2-992d-749008e9c1a6'
if __name__ == '__main__':
    a = AsyncResult(id=id, app=app)
    if a.successful():  # 执行完了
        result = a.get()  #
        print(result)
    elif a.failed():
        print('任务失败')
    elif a.status == 'PENDING':
        print('任务等待中被执行')
    elif a.status == 'RETRY':
        print('任务异常后正在重试')
    elif a.status == 'STARTED':
        print('任务已经开始被执行')

安装:pip install celery

当前解释器释放一个可执行文件:celery.exe

1.前期准备

提交异步的任务、执行完的结果也放在redis里面

image-20230308221009951

2.提交任务

这是其他程序,提交任务。异步调用

image-20230308120033089

现在只存在了redis中,没有执行。 在Broker中间件中,worker还未调用启动。

3.启动worker

image-20230308121406112

pip install eventlet,注意执行命令得在写celery代码的的文件下

image-20230308120446706

报错:4.x版本之后的worker启动得要: celery -A main worker -l info -P eventlet

image-20230308220435399

结果:

image-20230308221655030

4.结果存在redis中:

image-20230308221810794

查看任务的执行

image-20230308224200869

celery包结构

project
    ├── celery_task  	# celery包
    │   ├── __init__.py # 包文件
    │   ├── celery.py   # celery连接和配置相关文件,且名字必须交celery.py
    │   └── tasks.py    # 所有任务函数
    ├── add_task.py  	# 添加任务
    └── get_result.py   # 获取结果
    
    
############# 第一步:新建包 celery_task #############
# 在包下新建[必须叫celery]的py文件,celery.py 写代码
from celery import Celery
broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery('test', broker=broker, backend=backend, include=['celery_task.order_task', 'celery_task.user_task'])


##### 第二步:在包内部,写task,任务异步任务####
# order_task
from .celery import app
import time
@app.task
def add(a, b):
    print('-----', a + b)
    time.sleep(2)
    return a + b

# user_task
from .celery import app
import time
@app.task
def send_sms(phone, code):
    print("给%s发送短信成功,验证码为:%s" % (phone, code))
    time.sleep(2)
    return True

####第三步:启动worker ,包所在目录下
	celery  -A celery_task  worker -l info -P eventlet
    
    
###第四步:其他程序 提交任务,被提交到中间件中,等待worker执行,因为worker启动了,就会被worker执行
from celery_task import send_sms
res=send_sms.delay('1999999', 8888)
print(res)  # 7d39033c-4cc7-4af2-8d78-e62c277db183


### 第五步:worker执行完,结果存到backend中

### 第六步:我们查看结构
from celery_task import app
from celery.result import AsyncResult
id = '7d39033c-4cc7-4af2-8d78-e62c277db183'
if __name__ == '__main__':
    a = AsyncResult(id=id, app=app)
    if a.successful():  # 执行完了
        result = a.get()  #
        print(result)
    elif a.failed():
        print('任务失败')
    elif a.status == 'PENDING':
        print('任务等待中被执行')
    elif a.status == 'RETRY':
        print('任务异常后正在重试')
    elif a.status == 'STARTED':
        print('任务已经开始被执行')

image-20230308122201418

任务可能会有很多,有用用户、订单相关的任务

image-20230308122518374

image-20230308122817012

启动worker

要在包的路径下,不要进去,celery -A 包名 worker -l info -P evenlet

image-20230308122907210

启动结果:

image-20230308232359215

posted @   小福福  阅读(271)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
  1. 1 原来你也在这儿 温余福
  2. 2 世间美好和你环环扣扣 温余福
  3. 3 随风起舞 温余福
  4. 4 罪恶都市 温余福
罪恶都市 - 温余福
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王星

作曲 : 灰鸿啊/皮皮

编曲 : 夏日入侵企画

制作人 : 邢硕

节奏吉他 : 肯尼

主音吉他 : 张伟楠

贝斯 : 皮皮

鼓 : 海鑫

和声 : 邢硕

音效制作 : 邢硕

录音 : 邢硕/夏国兴

混音 : 于昊

特别鸣谢 : 张伟楠

这城市的车流和这地表的颤抖

像一颗石子落入地心之后泛起的温柔

暗涌

河水流过转角她的楼

被梦魇

轻声呓语唤醒身后的幼兽

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都

已忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去陈旧的还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池已失守

最终无法占有

无眠辗转

伴着人间破碎的旧梦

像繁星

退却后只剩下混沌的夜空

炙热

掩盖风声鹤唳的担忧

把所有失落无助反手推入

无尽的白昼

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都已经忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池早已失守

惶恐难以接受

缠绵往复不肯放手

最终无法占有

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁 灭 即 拯 救

谁掠夺春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

明知城池已失守

缠绵往复不肯放手

最终无法占有

点击右上角即可分享
微信分享提示