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求斐波那契数列示例分享
Feb 14 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
Python函数式编程
Jul 20 Python
python使用Tesseract库识别验证
Mar 21 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Django框架获取form表单数据方式总结
Apr 22 Python
Django ORM filter() 的运用详解
May 14 Python
Python基础之变量的相关知识总结
Jun 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中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
浅谈python中的变量默认是什么类型
2016/09/11 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
python openpyxl模块的使用详解
2021/02/25 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
自荐信模版
2013/10/24 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
安全教育实施方案
2014/03/02 职场文书
体育教师求职信
2014/05/24 职场文书
代收款委托书范本
2014/10/01 职场文书
军训新闻稿范文
2015/07/17 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL