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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
python之yield表达式学习
Sep 02 Python
Python返回真假值(True or False)小技巧
Apr 10 Python
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
python实现数组插入新元素的方法
May 22 Python
深入理解Django的自定义过滤器
Oct 17 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
Python requests发送post请求的一些疑点
May 20 Python
python监测当前联网状态并连接的实例
Dec 18 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
Python tkinter常用操作代码实例
Jan 03 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 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的特殊设置
2006/10/09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
实例讲解Python中的私有属性
2014/08/21 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python斐波那契数列的计算方法
2018/09/27 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
广告宣传策划方案
2014/05/21 职场文书
会计专业求职信
2014/08/10 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
作文批改评语
2014/12/25 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers
TS 类型兼容教程示例详解
2022/09/23 Javascript