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. 外网穿透-natapp安装配置(windows)

    natapp官网 natapp服务器更新:全面支持HTTPS协议以及本地SSL证书,支持WSS协议.同时支持HTTP/2 WEB协议,支持微信小程序本地开发.全面自动支持泛子域名与访客真实IP地址. ...

  2. EventBus事件总线(牛x版)

    事件总线: public interface IEventBus { void Trigger<TEvent>(TEvent eventData, string topic = null) ...

  3. thymeleaf:在一个页面中引入其它的页面

    这个在jsp中很容易实现,但是springBoot不推荐使用jsp,建议使用thymeleaf,下面是在thymeleaf中引入界面的方法 1.修改配置文件 spring: mvc: static-p ...

  4. 【oracle】update select语句

  5. 第03组 Beta版本演示

    队名:不等式方程组 组长博客 组员 340 张逸杰 组长 304 苏凯婷 312 鲍冰如 320 陈荣杰 331 杨锦镔 335 王嵚 336 林家伟 341 黄彬煌 342 黄智锋 343 吴智勇 ...

  6. java的GUI之SWT框架 配置开发环境(包含但不限于WindowBuilder完整教程,解决Unknown GUI toolkit报错,解决导入SWT包错误)

    官网(资料挺多的,API文档截图以及示例都有):https://www.eclipse.org/swt/ 克隆官方仓库 git clone --depth=1 git://git.eclipse.or ...

  7. ORA-01722 invalid number 一个比较隐蔽的可能错误原因

    在Oracle数据库中,数据类型为char或者varchar的字段,里面存储的数据,可以是纯数字串,比如:  3433,也可以是带有英文字符的字符串,比如:  3433a. Oracle对于纯数字串, ...

  8. python总结九

    1.sql语句: ,; 解释:由hire_date进行排序,降序desc,最大的就是最晚进来的员工,limit  如果是只有一个参数的话,那么说明是除了前面多少个数据, 如果后面有两个参数的话,那么就 ...

  9. Azure DevOps (TFS) 与 Office 集成

    Azure DevOps Service 或者Azure DevOps Server 都支持与office工具集成,实现在office中完成工作项的导入导出和批量修改等功能.用户可以使用自己熟悉的of ...

  10. ECMAScript 初探 - 对象篇

    一.对象 如果你用过 C++ 或 Java,肯定熟悉类(class).在 ECMAScript 中并没有 "类" 这个词, 其对应的是 "对象定义",不过这太拗 ...