celery的介绍和使用

celery介绍

celery是一个异步任务框架,它可以执行异步任务、延迟任务、定时任务

异步任务框架简述:

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

Celery架构

Celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。

image

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

使用场景

异步执行:解决耗时任务,将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等

延迟执行:解决延迟任务

定时执行:解决周期(周期)任务,比如每天数据统计

Celery的安装配置

pip install celery gevent

windows环境下启动celery

# module为python module名
celery -A <module> worker -l info -P gevent

celery执行异步任务

采用包架构封装(多任务结构)

在项目文件project下新建一个celery包

project
    ├── celery_task  	# celery包
    │   ├── __init__.py # 包文件
    │   ├── celery.py   # celery连接和配置相关文件,且名字必须叫celery.py
    │   └── tasks.py    # 所有任务函数
    ├── add_task.py  	# 添加任务
    └── get_result.py   # 获取结果

celery.py

# 导入模块
from celery import Celery
# 指定任务中间件和任务处理仓库为redis里的第一个库,后面1表示第一个,2表示第二个。
broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
# backend='redis://:123456@127.0.0.1:6379/1' redis加密码写法
# include列表里表示celery_task包里的task.py交给app处理
app = Celery(__name__,broker=broker, backend=backend, include=['celery_task.tasks'])

task.py

from .celery import app
import time
@app.task #添加该装饰器表示这个函数任务使用了celery框架的异步处理
def add(n, m):
    print(n)
    print(m)
    time.sleep(10)
    print('n+m的结果:%s' % (n + m))
    return n + m

@app.task
def low(n, m):
    print(n)
    print(m)
    print('n-m的结果:%s' % (n - m))
    return n - m

add_task.py
这个py文件是用来添加任务的,可以建在任意位置

from celery_task import tasks

# 添加立即执行任务
t1 = tasks.add.delay(10, 20)
t2 = tasks.low.delay(100, 50)
print(t1) # 获取的就是这个任务的id号


# 添加延迟任务
from datetime import datetime, timedelta
eta=datetime.utcnow() + timedelta(seconds=10)
tasks.low.apply_async(args=(200, 50), eta=eta)

get_result.py
这个py文件是用来获取任务处理的结果的

from celery_task.celery import app

from celery.result import AsyncResult

id = '21325a40-9d32-44b5-a701-9a31cc3c74b5' #输入任务的id号
if __name__ == '__main__':
    async = AsyncResult(id=id, app=app)
    if async.successful(): #如果这个任务执行成功
        result = async.get() #得到结果
        print(result)
    elif async.failed():
        print('任务失败')
    elif async.status == 'PENDING':
        print('任务等待中被执行')
    elif async.status == 'RETRY':
        print('任务异常后正在重试')
    elif async.status == 'STARTED':
        print('任务已经开始被执行')

celery执行延迟任务

在add_task.py里书写:

# 添加延迟任务
from datetime import datetime, timedelta
# datetime.utcnow()表示获取当前的utc时间,timedelta(seconds=10)表示加10秒timedelta括号里之后是时间类型,可以相加减
eta=datetime.utcnow() + timedelta(seconds=10)
# 使用的是apply_async这个方法,tasks.add这个是函数名,args括号里是函数add需要传的参数,eta必须是utc时间
tasks.add.apply_async(args=(200, 50), eta=eta)

celery执行定时任务

将celery.py添加以下定时配置

# 导入模块
from celery import Celery
# 指定任务中间件和任务处理仓库为redis里的第一个库,后面1表示第一个,2表示第二个。
broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
# backend='redis://:123456@127.0.0.1:6379/1' redis加密码写法
# include列表里表示celery_task包里的task.py交给app处理
app = Celery(__name__,broker=broker, backend=backend, include=['celery_task.tasks'])


# 定时任务配置
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False

# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
    'add-task': {
        'task': 'celery_task.tasks.add',  # celery_task.tasks.low这个是你函数任务的位置,task是固定的
        'schedule': timedelta(seconds=3), # 每隔三秒执行一次
        # 'schedule': crontab(hour=8, day_of_week=1),  # 每周一早八点
        'args': (300, 150), # 函数任务需要传入的参数
    }
}

然后在终端下cd到scripts文件夹

执行celery -A celery_task beat
表示开始定时发布任务

celery在django中的使用

需要在celery.py中添加以下代码:

# 加载django环境
import os
import django
# luffyapi.settings.dev 这个是项目的配置文件位置
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")
django.setup()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:celery的介绍和使用 - Python技术站

(0)
上一篇 2023年4月2日 下午4:30
下一篇 2023年4月2日

相关文章

  • admin后台管理数据库里的表

    admin后台管理 django给您提供了一个可视化图形界面,来方便您来对数据库里的表进行增删改查的管理 但是!使用admin后台管理你自己注册的模型表时,需要自行进行先注册该表! 在应用下的admin.py里进行注册: from django.contrib import admin from app01 import models # Register …

    2023年4月2日
    00
  • 小程序开发环境搭建

    如何开发微信小程序 小程序:学习微信开发的语言(前端html、css、js、vue.js) 微信开发者工具 API:restful接口(Python+django+drf框架)。 pycharm 环境搭建 python环境搭建 虚拟环境 django drf pycharm 小程序环境 在微信公众平台上注册一个小程序账号 在开发设置里保存好自己的appid …

    2023年4月2日
    00
  • 微信小程序的点击事件、页面跳转、数据绑定、数据修改、获取用户信息及定位、for指令、获取用户上传图片

    小程序中实现页面跳转 对标签绑定点击事件 data是点击时传入的参数 <view bindtap=”clickMe” data-nid=”123″ data-name=”SD” >点我跳转</view> /** * 用户点击事件 */ clickMe(e){ console.log(e) var nid = e.currentTarg…

    Python开发 2023年4月2日
    00
  • 首页轮播图后端接口设计

    逻辑导航 1.当一访问127.0.0.1:8000时,就会向某一地址发送请求2.请求接口需要返回首页所需要的轮播图片3.前端vue轮播图组件循环一下后端发送的图片连接列表,依次展示轮播图 轮播图表设计 轮播图中一些共有的字段,我们可以创建一个公共的基础表,以后需要该字段直接基础该表就行 基表,可以放在自己写的utils.py里,以便后期使用! from dj…

    2023年4月2日
    00
  • django中的自定义分页器

    1.什么是自定义分页器 当我们需要在前端页面展示的数据太多的时候,我们总不能将数据展示在一页上面吧!这时,我们就需要自定义一个分页器,将数据分成特定的页数进行展示,每一页展示固定条数的数据! 2.为什么要用自定义分页器 如上所说:为了将数据分成多页进行展示,分别阅读,方便查询! 3.如何使用自定义分页器 3.1 自定义分页器推导过程 虽然!我们有一个封装好的…

    2023年4月2日
    00
  • 文章详情页制作

    url的设计 /usrname/article/1 /用户名/article/文章主键值 re_path(r’^(?P<username>\w+)/article/(?P<article_id>\d+)/$’,views.article_detail,name=’detail’), 视图函数的设计 # 七、文章详情页 def arti…

    Python开发 2023年4月2日
    00
  • 小程序用户和登录页面展示

    用户页面wxml <!–pages/home/home.wxml–> <view class=”container”> <view class=”top-view”> <view class=”user”> <view class=”row”> <image class=”avatar” …

    Python开发 2023年4月2日
    00
  • 迭代器与生成器

    1.什么是迭代器 迭代器是用来迭代取值的工具,而迭代的意思是一个重复的过程,每一次的重复都是基于上一次的结果继续的,单纯的重复并不是迭代 2.为何要有迭代器 在python中涉及到需要把多个值循环取出来的类型有:字符串、列表、元组、字典、集合、打开文件等,我们可以考虑使用while循环的方式来循环取出多个值,例如: list=[‘egon’,’lin’,11…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部