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内置的字符串处理函数整理
Jan 29 Python
Python文件操作类操作实例详解
Jul 11 Python
Django中Model的使用方法教程
Mar 07 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
详解python算法之冒泡排序
Mar 05 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python从PDF中提取数据的示例
Oct 30 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牛逼的面试题分享
2013/01/18 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JS Timing
2007/04/21 Javascript
jquery tools之tooltip
2009/07/25 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
深入理解Django中内置的用户认证
2017/10/06 Python
django实现用户登陆功能详解
2017/12/11 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
教师自荐书
2013/10/08 职场文书
金融专业毕业生推荐信
2013/11/26 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
预备党员转正意见
2015/06/01 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
mysql中关键词exists的用法实例详解
2022/06/10 MySQL