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中用Decorator来简化元编程的教程
Apr 13 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
基于python实现聊天室程序
Jul 27 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
python分割一个文本为多个文本的方法
Jul 22 Python
Django stark组件使用及原理详解
Aug 22 Python
python中调试或排错的五种方法示例
Sep 12 Python
Python求正态分布曲线下面积实例
Nov 20 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 Python
Python 中如何写注释
Aug 28 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 $_ENV为空的原因分析
2009/06/01 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
详细分析Node.js 多进程
2020/06/22 Javascript
python中xrange用法分析
2015/04/15 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
python使用Tesseract库识别验证
2018/03/21 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
海南地接欢迎词
2014/01/14 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs