Django中使用Celery的方法步骤


Posted in Python onDecember 07, 2020

(一)、概述

Celery是一个简单、灵活和可靠的基于多任务的分布式系统,为运营提供用于维护此系统的工具。专注于实时处理的任务队列,同时也支持任务的调度。执行单元为任务(task),利用多线程这些任务可以被并发的在单个或多个职程(worker)上运行。

Celery通过消息机制通信,通常通过中间人(broker)来分配和调节客户端与职程服务器(worker)之间的通信。客户端发送一条消息,中间人把消息分配给一个职程,最后由职程来负责执行此任务。

Celery可以有多个职程和中间人,这样提高了高可用性和横向的扩展能力

Celery由python语言开发,但是该协议可以用任何语言拉力实现,例如:Django中的Celery、node中的node-celery和php中的celery-php

(二)、Django中使用Celery的流程与配置

导入Celery:pip3 install Celery

在 与项目同名的目录下 创建celery.py文件,特别注意:项目同名的目录下

复制内容到该文件

修改两处内容

  • os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')中的proj改为项目名
  • app = Celery('pro')中的pro改为项目名
import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('pro')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#  should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
  print(f'Request: {self.request!r}')

在 与项目同名的目录下 的__init__.py文件中添加内容

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

在settings.py文件中添加配置

  • CELERY_BROKER_URL:中间人url,可以配置redis或者RabbitMQ
  • CELERY_RESULT_BACKEND:返回结果的存储地址
  • CELERY_ACCEPT_CONTENT:接收内容的格式,分为两种:json和msgpack。msgpack比json格式的数据体积更小,传输速度更快。
  • CELERY_TASK_SERIALIZER:任务载荷的序列化方式-->json
  • CELERY_TIMEZONE
  • CELERY_TASK_TRACK_STARTED:是否开启任务跟踪
  • CELERY_TASK_TIME_LIMIT:任务超时限制
# Celery配置
CELERY_BROKER_URL = env("CELERY_BROKER_URL")
CELERY_RESULT_BACKEND = env("CELERY_RESULT_BACKEND")
CELERY_ACCEPT_CONTENT = ["json", "msgpack"]
CELERY_TASK_SERIALIZER = "json"
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

在app下创建tasks.py文件,创建发送消息功能,任务方法必须添加装饰器:@shared_task

from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from time import sleep
from celery import shared_task

class TestView3(GenericAPIView):

  @classmethod
  @shared_task
  def sleep(self, duration):
    sleep(duration)
    return Response("成功", status=200)

创建视图和路由

### views.py
from .tasks import TestView3
class TestView1(GenericAPIView):
  def get(self, request):
    TestView3.sleep(10)
    return Response("celery实验成功")
test_view_1 = TestView1.as_view()

### urls.py
from django.urls import path
from .views import (
  test_view_1
)

urlpatterns = [
  path('celery/', test_view_1, name="test1")
]

安装redis并启动

启动django项目

使用Celery命令启动Celery服务,命令:celery -A 项目名 worker -l info,如果如下所示则为启动成功.

celery@AppledeMacBook-Air.local v5.0.3 (singularity)

Darwin-20.1.0-x86_64-i386-64bit 2020-12-05 20:52:17

[config]
.> app:     drf_email_project:0x7f84a0c4ad68
.> transport:  redis://127.0.0.1:6379/1%20
.> results:   redis://127.0.0.1:6379/2
.> concurrency: 4 (prefork)
.> task events: OFF (enable -E to monitor tasks in this worker)

[queues]
.> celery      exchange=celery(direct) key=celery


[tasks]
 . drf_email_project.celery.debug_task
 . users.tasks.sleep

[2020-12-05 20:52:18,166: INFO/MainProcess] Connected to redis://127.0.0.1:6379/1%20
[2020-12-05 20:52:18,179: INFO/MainProcess] mingle: searching for neighbors
[2020-12-05 20:52:19,212: INFO/MainProcess] mingle: all alone
[2020-12-05 20:52:19,248: WARNING/MainProcess] /Users/apple/drf-email/lib/python3.7/site-packages/celery/fixups/django.py:204: UserWarning: Using settings.DEBUG leads to a memory
      leak, never use this setting in production environments!
 leak, never use this setting in production environments!''')

[2020-12-05 20:52:19,249: INFO/MainProces

到此这篇关于Django中使用Celery的方法步骤的文章就介绍到这了,更多相关Django使用Celery的方法步骤内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
python使用super()出现错误解决办法
Aug 14 Python
python中hashlib模块用法示例
Oct 30 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
用python实现刷点击率的示例代码
Feb 21 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
pyQt5实时刷新界面的示例
Jun 25 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
Django crontab定时任务模块操作方法解析
Sep 10 Python
python urllib和urllib3知识点总结
Feb 08 Python
python集合的新增元素方法整理
Dec 07 #Python
python进行二次方程式计算的实例讲解
Dec 06 #Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 #Python
python中二分查找法的实现方法
Dec 06 #Python
python中判断数字是否为质数的实例讲解
Dec 06 #Python
Django搭建项目实战与避坑细节详解
Dec 06 #Python
python温度转换华氏温度实现代码
Dec 06 #Python
You might like
php Mysql日期和时间函数集合
2007/11/16 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
vue如何截取字符串
2019/05/06 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
C#实现启动一个进程
2016/10/01 面试题
情侣吵架检讨书
2014/02/05 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
初中家长寄语
2014/04/02 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
体育活动总结范文
2014/05/04 职场文书
三严三实学习心得体会
2014/10/13 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
MySQL中in和exists区别详解
2021/06/03 MySQL
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
室外天线与收音机天线杆接合方法
2022/04/05 无线电