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的lambda匿名函数的简单介绍
Apr 25 Python
python实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 Python
Python语法快速入门指南
Oct 12 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python中实现switch功能实例解析
Jan 11 Python
解读python logging模块的使用方法
Apr 17 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
python xpath获取页面注释的方法
Jan 14 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
AI:如何训练机器学习的模型
Apr 16 Python
Python - 10行代码集2000张美女图
May 23 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类
2016/01/09 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
js资料toString 方法
2007/03/13 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python 基于opencv操作摄像头
2020/12/24 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
PHP开发的一般流程
2013/08/13 面试题
公司培训心得体会
2014/01/03 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
领导调研接待方案
2014/02/27 职场文书
疾病捐款倡议书
2014/05/13 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
黄石寨导游词
2015/02/05 职场文书
初中体育教学随笔
2015/08/15 职场文书