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中用于去除空格的三个函数的使用小结
Apr 07 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
python3编码问题汇总
Sep 06 Python
Django实现组合搜索的方法示例
Jan 23 Python
python实现石头剪刀布程序
Jan 20 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
Python如何配置环境变量详解
May 18 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
关于vue面试题汇总
2018/03/20 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
python正则表达式中的括号匹配问题
2014/12/14 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
浅析Python 责任链设计模式
2020/09/11 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
幼儿园教师工作感言
2014/02/15 职场文书
高中军训感想300字
2014/03/04 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
民主评议党员总结
2014/10/20 职场文书
员工离职感谢信
2015/01/22 职场文书
工程移交协议书
2016/03/24 职场文书
创业计划书之物流运送
2019/09/17 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
Windows server 2012搭建FTP服务器
2022/04/29 Servers