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的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
一百行python代码将图片转成字符画
Feb 19 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python实现人像动漫化的示例代码
May 17 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
python urllib和urllib3知识点总结
Feb 08 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
Opencv中cv2.floodFill算法的使用
Jun 18 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
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
python实现比较文件内容异同
2018/06/22 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
创业计划书的主要内容有哪些
2014/01/29 职场文书
2014信息公开实施方案
2014/02/22 职场文书
气象学专业个人求职信
2014/03/15 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
销售督导岗位职责
2015/04/10 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫