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自带的http模块详解
Nov 06 Python
python中for用来遍历range函数的方法
Jun 08 Python
深入浅析Python传值与传址
Jul 10 Python
python连接mongodb密码认证实例
Oct 16 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
Python实现12306火车票抢票系统
Jul 04 Python
对Django url的几种使用方式详解
Aug 06 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
Python2与Python3的区别点整理
Dec 12 Python
Python实现不规则图形填充的思路
Feb 02 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
PHP与MySQL交互使用详解
2006/10/09 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
客户接待方案
2014/02/26 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
无私奉献演讲稿
2014/09/04 职场文书
幼师个人总结范文
2015/02/28 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
放假通知范文
2015/04/14 职场文书
原告离婚代理词
2015/05/23 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js