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实用技巧两则
Aug 29 Python
基于python log取对数详解
Jun 08 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python生成一个迭代器的实操方法
Jun 18 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
Python Web版语音合成实例详解
Jul 16 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
np.random.seed() 的使用详解
Jan 14 Python
django教程如何自学
Jul 31 Python
python设置中文界面实例方法
Oct 27 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
PHP输出时间差函数代码
2013/01/28 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP制作用户注册系统
2015/10/23 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
JS常用算法实现代码
2016/11/14 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
python复制文件代码实现
2013/12/23 Python
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python greenlet实现原理和使用示例
2014/09/24 Python
Python计算程序运行时间的方法
2014/12/13 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
写好自荐信要注意的问题
2013/11/10 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
教师个人年度总结
2015/02/11 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang