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入门篇之列表和元组
Oct 17 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
Python简单实现控制电脑的方法
Jan 22 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
python 操作hive pyhs2方式
Dec 21 Python
Python chardet库识别编码原理解析
Feb 18 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
python如何构建mock接口服务
Jan 28 Python
详解Flask开发技巧之异常处理
Jun 15 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
一个程序下载的管理程序(四)
2006/10/09 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
PHP7变量处理机制修改
2021/03/09 PHP
js身份证验证超强脚本
2008/10/26 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
详解js私有作用域中创建特权方法
2016/01/25 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python入门_浅谈for循环、while循环
2017/05/16 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python的常用模块之collections模块详解
2018/12/06 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
学习演讲稿范文
2014/05/10 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
拖欠货款起诉状
2015/05/20 职场文书
高中化学教学反思
2016/02/22 职场文书