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 图片验证码代码分享
Jul 04 Python
python中精确输出JSON浮点数的方法
Apr 18 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
基于Python List的赋值方法
Jun 23 Python
Python中的Django基本命令实例详解
Jul 15 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
python读取excel进行遍历/xlrd模块操作
Jul 12 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
如何利用Python写个坦克大战
2020/11/18 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
外贸英语毕业生自荐信
2013/11/14 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
储备店长岗位职责
2015/04/14 职场文书
九年级语文教学反思
2016/03/03 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python