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

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

celery介绍和安装

celery它是一个分布式异步框架,celery翻译过来是"芹菜"的意思
1.完成异步任务:可以提高项目的并发量,之前开启线程,现在使用celery,

2.完成延迟任务

3.完成定时任务

# 理解celery的运行原理

1)可以不依赖任何服务器,通过自身命令,启动服务
2)celery服务为为其他项目服务提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求


# 我们可以这样来理解
人是一个独立运行的服务 | 医院也是一个独立运行的服务
	正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题
	人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求

架构

celery架构
1.任务中间件:broker(中间件),其他服务提交的异步任务,抖放在这里,celery本身是不提供中间件的,需要借助于第三方
2.任务执行单元:worker,真正执行任务的地方,一个个进程,执行函数
3.结果存储:backend,函数return的结果存储在这里,celery本身不提供结果存储,借助于第三方:redis,数据库,rabbitmq

img

celery快速使用

1.celery官网:http://www.celeryproject.org/
第一步:新建 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

第二步:其他程序,提交任务
from main import add
# 同步调用
# res = add(5,6)
# print(res)

# 异步调用
res = add.delay(5,6)
print(res)         # 2abff7cc-2a84-4c9e-ba24-73f8777a8c6d
第三步:启动worker
# 启动worker命令,win需要安装eventlet
(luffy) D:\pythonProject\luffy_api2\scripts\celery>celery  -A main  worker -l info -P eventlet

第四步:worker会执行消息中间件中的任务,把结果存起来
第五步:拿执行的结果
from main import app
from celery.result import AsyncResult
id = '2abff7cc-2a84-4c9e-ba24-73f8777a8c6d'
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

celery包结构

project
    ├── celery_task  	# celery包
    │   ├── __init__.py # 包文件
    │   ├── celery.py   # celery连接和配置相关文件,且名字必须叫celery.py
    │   └── tasks.py    # 所有任务函数
    ├── add_task.py  	# 添加任务
    └── get_result.py   # 获取结果
第一步:新建包 celery_task
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) 
第五步: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('任务已经开始被执行')
posted @ 2023-03-08 22:12  小王应该在学习!  阅读(88)  评论(0编辑  收藏  举报