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模拟登陆类
Mar 29 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
详解python之heapq模块及排序操作
Apr 04 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 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写入、删除与复制文件的方法
2015/06/20 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python发布模块的步骤分享
2014/02/21 Python
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
Python字符串替换实例分析
2015/05/11 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Python super()函数使用及多重继承
2020/05/06 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
举例讲解Python装饰器
2020/12/24 Python
linux面试题参考答案(10)
2016/10/26 面试题
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
女方婚礼新郎答谢词
2014/01/11 职场文书
十八大感想感言
2014/02/10 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
售后客服工作职责
2014/06/16 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
企业消防安全责任书
2014/07/23 职场文书
股东合作协议书
2014/09/12 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
Mybatis是这样防止sql注入的
2021/12/06 Java/Android