Django中使用Celery的方法示例


Posted in Python onNovember 29, 2018

起步

在 《分布式任务队列Celery使用说明》 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能。本文介绍如何在 Django 中使用 Celery。

安装

pip install django-celery

这个命令使用的依赖是 Celery 3.x 的版本,所以会把我之前安装的 4.x 卸载,不过对功能上并没有什么影响。我们也完全可以仅用Celery在django中使用,但使用 django-celery 模块能更好的管理 celery。

使用

可以把有关 Celery 的配置放到 settings.py 里去,但我比较习惯单独一个文件来放,然后在 settings.py 引入进来:

# celery_config.py
import djcelery
import os

os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')
djcelery.setup_loader()

BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'

# UTC
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = 'Asia/Shanghai'

CELERY_IMPORTS = (
 'app.tasks',
)

# 有些情况可以防止死锁
CELERY_FORCE_EXECV = True

# 设置并发的worker数量
CELERYD_CONCURRENCY = 4

# 任务发送完成是否需要确认,这一项对性能有一点影响
CELERY_ACKS_LATE = True

# 每个worker执行了多少任务就会销毁,防止内存泄露,默认是无限的
CELERYD_MAX_TASKS_PER_CHILD = 40

# 规定完成任务的时间
CELERYD_TASK_TIME_LIMIT = 15 * 60 # 在15分钟内完成任务,否则执行该任务的worker将被杀死,任务移交给父进程

# 设置默认的队列名称,如果一个消息不符合其他的队列就会放在默认队列里面,如果什么都不设置的话,数据都会发送到默认的队列中
CELERY_DEFAULT_QUEUE = "default"

# 设置详细的队列
CELERY_QUEUES = {
 "default": { # 这是上面指定的默认队列
  "exchange": "default",
  "exchange_type": "direct",
  "routing_key": "default"
 },
 "beat_queue": {
  "exchange": "beat_queue",
  "exchange_type": "direct",
  "routing_key": "beat_queue"
 }

}

配置文件中设置了 CELERY_IMPORTS 导入的任务,所以在django app中创建相应的任务文件:

# app/tasks.py
from celery.task import Task
import time

class TestTask(Task):
 name = 'test-task' # 给任务设置个自定义名称

 def run(self, *args, **kwargs):
  print('start test task')
  time.sleep(4)
  print('args={}, kwargs={}'.format(args, kwargs))
  print('end test task')

在 settings.py 添加:

INSTALLED_APPS = [
 # ...
 'djcelery',
]

# Celery
from learn_django.celery_config import *

触发任务或提交任务可以在view中来调用:

# views.py
from django.http import HttpResponse
from app.tasks import TestTask

def test_task(request):
 # 执行异步任务
 print('start do request')
 t = TestTask()
 t.delay()
 print('end do request')
 return HttpResponse('ok')

启动 woker 的命令是:

python manage.py celery worker -l info

再启动django,访问该view,可以看到任务在worker中被消费了。

定时任务

在celery的配置文件 celery_config.py 文件中添加:

CELERYBEAT_SCHEDULE = {
 'task1-every-1-min': { # 自定义名称
  'task': 'test-task', # 与任务中name名称一致
  'schedule': datetime.timedelta(seconds=5),
  'args': (2, 15),
  'options': {
   'queue': 'beat_queue', # 指定要使用的队列
  }
 },

}

通过 options 的 queque 来指定要使用的队列,这里需要单独的队列是因为,如果所有任务都使用同一队列,对于定时任务来说,任务提交后会位于队列尾部,任务的执行时间会靠后,所以对于定时任务来说,使用单独的队列。

启动 beat:

python manage.py celery beat -l info

监控工具 flower

如果celery中的任务执行失败了,有些场景是需要对这些任务进行监控, flower 是基于 Tornado 开发的web应用。安装用 pip install flower ;启动它可以是:

python manage.py celery flower

# python manage.py celery flower --basic_auth=admin:admin

用浏览器访问 http://localhost:5555 即可查看:

Django中使用Celery的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的多重继承实例讲解
Sep 28 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
python使用PyQt5的简单方法
Feb 27 Python
python获取地震信息 微信实时推送
Jun 18 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
详解python中的模块及包导入
Aug 30 Python
python实现多线程端口扫描
Aug 31 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
Python高并发解决方案实现过程详解
Jul 31 Python
记一次python 内存泄漏问题及解决过程
Nov 29 #Python
对python pandas 画移动平均线的方法详解
Nov 28 #Python
对pandas中时间窗函数rolling的使用详解
Nov 28 #Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 #Python
使用python对文件中的数值进行累加的实例
Nov 28 #Python
python的concat等多种用法详解
Nov 28 #Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 #Python
You might like
关于PHP堆栈与列队的学习
2013/06/21 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
Yii分页用法实例详解
2014/12/04 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python安装requests库的实例代码
2019/06/25 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
汽车检测与维修专业求职信
2013/10/30 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
高三教师工作总结2015
2015/07/21 职场文书
关于分班的感言
2015/08/04 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server