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私有属性和方法实例分析
Jan 15 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
python中%格式表达式实例用法
Jun 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
PHP抽象类 介绍
2012/06/13 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP数组操作类实例
2015/07/11 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
微信小程序网络封装(简单高效)
2018/08/06 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
零基础写python爬虫之神器正则表达式
2014/11/06 Python
python计算文本文件行数的方法
2015/07/06 Python
详解Django中Request对象的相关用法
2015/07/17 Python
python清除函数占用的内存方法
2018/06/25 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
Python线程threading模块用法详解
2020/02/26 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
教师演讲稿范文
2014/01/08 职场文书
学校万圣节活动方案
2014/02/13 职场文书
村党支部换届选举方案
2014/05/02 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python