celery异步框架

1、介绍

1 celery:芹菜,分布式的异步任务框架
2 可以做的事,我们用它来解决什么问题
	- 异步任务 (异步的执行这个任务函数)
    - 延迟任务(延迟5s钟,执行一个任务(函数))
    - 定时任务(定时的执行任务(函数))如果单纯执行定时任务,没必要用		celery,可以使用别的
3 平台问题
    Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform
4 读一下
"""
1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)
2)celery服务为为其他项目服务提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求

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

5 Celery的架构由三部分组成,
	-消息中间件(message broker)
    	-Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等
    -任务执行单元(worker)
    	-Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中
    -任务执行结果存储(task result store)
    	-Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

2 简单使用

1 pip install celery
2 两种目录组织结构
	-普通的
    -包管理的(推荐的)
3 普通的(就一个py文件)

celery -A proj worker -l INFO
celery -A celery_task worker -l info -P eventlet

4 基本使用
	

2.1 基本使用

# 第一步:定义一个py文件(名字随意,我们叫celery_tase)
from celery import Celery
backend = 'redis://127.0.0.1:6379/1'
broker = 'redis://127.0.0.1:6379/2'
app = Celery(__name__,broker=broker,backend=backend)
# 被它修饰,就变成了celery的任务
@app.task
def add(a,b):
    return a+b

#第二步:提交任务(新建一个py文件:submit_task)
from celery_task import add
# 异步调用
# 只是把任务提交到了redis中,但是没有执行,返回一个唯一标识,后期使用唯一标识去看任务执行结果
res=add.delay(33,41)
print(res)

#第三步:启动worker
#celery_task py文件的名字
#-l info日志输出级别是info 
# -P eventlet  在win平台需要加上
celery -A celery_task worker -l info -P eventlet
#如果队列里有任务,就会执行,如果没有任务,worker就等在这

# 第四步:查询结果是否执行完成
from celery_task import app

from celery.result import AsyncResult

id = 'ed85b97a-a231-4d71-ba11-e5f6450d0b47'
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('任务已经开始被执行')

2.2 包管理结构

1 包结构
	celery_task
        __init__.py
        celery.py
        course_task.py
        home_task.py
        user_task.py
2 celery.py

from celery import Celery
backend = 'redis://127.0.0.1:6379/1'
broker = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend,
             include=['celery_task.course_task', 'celery_task.user_task', 'celery_task.home_task'])

3 home_task.py
from .celery import app
@app.task
def add(a,b):
    import time
    time.sleep(10)
    return a+b
4 在任意项目中使用
	-导入,之间使用,例如
    def test(request):
    # 提交一个计算 90+80的任务
    from celery_task.home_task import add
    res=add.delay(90,80)
    return HttpResponse('任务已经提,任务id为:%s'%str(res))

3 celery 执行延迟任务

1 其他不用变,提交任务的时候
from celery_task.user_task import mul
from datetime import datetime, timedelta
eta = datetime.utcnow() + timedelta(seconds=10)
# 参数传递需要使用args,传时间要使用时间对象,使用的是utc时间
mul.apply_async(args=(200, 50), eta=eta)

4 celery执行定时任务

#第一步:在celery.py中配置
# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
    'task-mul': {
        'task': 'celery_task.user_task.mul',
        'schedule': timedelta(seconds=3),  # 3s后
        # 'schedule': crontab(hour=8, day_of_week=1),  # 每周一早八点
        'args': (3, 15),
    },
    'task-add': {
        'task': 'celery_task.home_task.add',
        'schedule': timedelta(seconds=10),  # 10s后
        # 'schedule': crontab(hour=8, day_of_week=1),  # 每周一早八点
        'args': (3, 5),
    },

}


#第二步:启动beat(beat负责定时提交任务)
celery -A celery_task beat -l info
# 第三步:启动worker,任务就会被worker执行了
celery -A celery_task worker -l info -P eventlet





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值