Celery简介

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

消息中间件

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

任务执行单元

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

任务结果存储

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

使用场景

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

定时任务:定时执行某件事情,比如每天数据统计

Celery的安装和配置

安装:pip install celery

消息中间件:RabbitMQ/Redis

app = Celery('任务名', broker=‘xxx’, bankend='vvv')

Celery执行异步任务

基本使用

包架构封装

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

celery.py

# 1)创建app + 任务

# 2)启动celery(app)服务:
# 非windows
# 命令:celery worker -A celery_task -l info
# windows:
# pip3 install eventlet
# celery worker -A celery_task -l info -P eventlet # 3)添加任务:手动添加,要自定义添加任务的脚本,右键执行脚本 # 4)获取结果:手动获取,要自定义获取任务的脚本,右键执行脚本 from celery import Celery """
broker=存储tasks的仓库
backend=存储results的仓库
include=[任务文件们]
""" broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2' # redis有密码时
# broker = 'redis://:123456@127.0.0.1:6379/2'
# backend = 'redis://:123456@127.0.0.1:6379/3'
app = Celery(broker=broker, backend=backend, include=['celery_task.tasks']) # 启动celery服务的命令:
# 前提:一定要进入celery_task所属的文件夹
# celery worker -A celery_task -l info -P eventlet

tasks.py

from .celery import app
import time @app.task
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

from celery_task import tasks

# 添加立即执行任务
t1 = tasks.add.delay(10, 20)
t2 = tasks.low.delay(100, 50)
print(t1.id)

get_result.py

from celery_task.celery import app
from celery.result import AsyncResult id = '4e249f2d-559a-4a3e-8b43-d498b3d6355e' # 随机的任务结果
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('任务已经开始被执行')

延时任务

包架构封装

project
|-- celery_task
| |-- __init__.py
| |-- celery.py
| |-- tasks.py
|-- add_task.py
|-- get_result.py

celery.py

from celery import Celery

broker = 'redis://127.0.0.1:6379/11'
backend = 'redis://127.0.0.1:6379/12'
include = ['celery_task.tasks',]
app = Celery(broker=broker, backend=backend, include=include) # 启动celery服务的命令:
# 前提:一定要进入celery_task所属的文件夹
# celery worker -A celery_task -l info -P eventlet

tasks.py

from .celery import app

@app.task
def add(n, m):
res = n + m
print(res)
return res @app.task
def low(n, m):
res = n - m
print(res)
return res

add_task.py

from celery_task.tasks import add, low

# 添加延迟任务
from datetime import datetime, timedelta def eta_second(second):
ctime = datetime.now()
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
time_delay = timedelta(seconds=second)
return utc_ctime + time_delay # 手动添加 延迟任务
if __name__ == '__main__':
result = add.apply_async(args=(200, 50), eta=eta_second(10))
print(result.id)
result = low.apply_async(args=(200, 50), eta=eta_second(8))
print(result.id)

get_result.py

from celery_task.celery import app
from celery.result import AsyncResult id = '74b4f1b2-36ee-4eab-afa7-3da40b7e794e' 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('任务已经开始被执行')

定时任务

包架构封装

project
|-- celery_task
| |-- __init__.py
| |-- celery.py
| |-- tasks.py

celery.py

from celery import Celery

broker = 'redis://127.0.0.1:6379/11'
backend = 'redis://127.0.0.1:6379/12'
include = ['celery_task.tasks',]
app = Celery(broker=broker, backend=backend, include=include) # 启动celery服务的命令:
# 前提:一定要进入celery_task所属的文件夹
# celery worker -A celery_task -l info -P eventlet # 自动添加任务
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False # 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'low-task': {
'task': 'celery_task.tasks.low',
'schedule': timedelta(seconds=3),
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'args': (300, 150),
},
'my-add-task': {
'task': 'celery_task.tasks.add',
'schedule': timedelta(seconds=6),
'args': (300, 150),
}
} # 启动 添加任务 服务的命令
# celery beat -A celery_task -l info

tasks.py

from .celery import app

@app.task
def add(n, m):
res = n + m
print(res)
return res @app.task
def low(n, m):
res = n - m
print(res)
return res

异步处理Django任务

包架构封装

project
|-- celery_task
| |-- __init__.py
| |-- celery.py
| |-- tasks.py

celery.py

# 启动django依赖

import sys
sys.path.append(r'C:\Users\oldboy\Desktop\luffy\luffyapi') import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
django.setup() from celery import Celery broker = 'redis://127.0.0.1:6379/11'
backend = 'redis://127.0.0.1:6379/12'
include = ['celery_task.tasks',]
app = Celery(broker=broker, backend=backend, include=include) # 启动celery服务的命令:
# 前提:一定要进入celery_task所属的文件夹
# celery worker -A celery_task -l info -P eventlet # 自动添加任务
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False # 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'django-task': {
'task': 'celery_task.tasks.django_task',
'schedule': timedelta(seconds=3),
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'args': (300, 150),
},
} # 启动 添加任务 服务的命令
# celery beat -A celery_task -l info

tasks.py

from .celery import app

@app.task
def django_task():
pass

案例:

celery.py

# 启动django依赖

# 将celery服务框架放在项目根目录下
# import sys
# sys.path.append(r'C:\Users\oldboy\Desktop\luffy\luffyapi') import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings')
django.setup() from celery import Celery broker = 'redis://127.0.0.1:6379/11'
backend = 'redis://127.0.0.1:6379/12'
include = ['celery_task.tasks',]
app = Celery(broker=broker, backend=backend, include=include) app.conf.timezone = 'Asia/Shanghai' app.conf.enable_utc = False # 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'django-task': {
'task': 'celery_task.tasks.django_task',
'schedule': timedelta(seconds=10),
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'args': (),
},
}

tasks.py

from .celery import app
from django.core.cache import cache
from apps.home import models, serializers @app.task
def django_task():
banner_query = models.Banner.objects.filter(is_show=True, is_delete=False).order_by('-orders')
banner_list_data = serializers.BannerModelSerializer(banner_query, many=True).data
# 建立接口缓存
cache.set('api_banner_list_data', banner_list_data)
return '轮播图缓存更新完毕'

Celery简介以及Django中使用celery的更多相关文章

  1. celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决

    今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...

  2. Django 中使用 Celery

    起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...

  3. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

  4. Python—在Django中使用Celery

    一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...

  5. Python单元测试简介及Django中的单元测试

    Python单元测试简介及Django中的单元测试 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分 ...

  6. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  7. Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示

    解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...

  8. 四、Django中使用celery

    项目跟目录创建celery包,目录结构如下: mycelery/ ├── config.py ├── __init__.py ├── main.py └── sms/ ├── __init__.py ...

  9. Django项目中使用celery做异步任务

    异步任务介绍 在写项目过程中经常会遇到一些耗时的任务, 比如:发送邮件.发送短信等等~.这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行 celery就是用于处理 ...

随机推荐

  1. 2.4 Scala函数式编程

    一.函数定义与使用 1.函数的定义 2.匿名函数 举例: Scala自动推断变量类型,不用声明: 一个下划线只能表示这一个参数的一次出现 二.高阶函数 定义:函数定义的括号里仍然是个函数的函数,叫作高 ...

  2. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  3. nullptr与NULL

    NULL NULL can be defined as any null pointer constant. Thus existing code can retain definitions of  ...

  4. springboot整合邮件

    一.邮件相关知识补充 SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属 ...

  5. 快速安装Rainbond——开源企业级Paas平台

    快速安装Rainbond--开源企业级Paas平台 参考:https://www.rainbond.com/docs/user-operations/install/online_install/ R ...

  6. python 之Entry

    # Tkinter教程之Entry篇 # Entry用来输入单行文本 from tkinter import * root = Tk() # 创建entry Entry(root, text='inp ...

  7. (day45)JavaScript

    目录 一.什么是JavaScript 二.注释 三.引入方式 (1)script标签内联 (2)script标签外联 四.变量 (一)变量声明 (二)命名规范 五.数据类型 (一)数值类型Number ...

  8. CS231n:

    Bayesian Hyperparameter Optimization is a whole area of research devoted to coming up with algorithm ...

  9. 【java】isEmpty VS isBlank 的区别

  10. 2019SDN上机第2次作业

    1. 利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 创建拓扑: 拓扑支持OpenFlo ...