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引用(import)文件夹下的py文件的方法
Aug 26 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
python中比较两个列表的实例方法
Jul 04 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
详解python安装matplotlib库三种失败情况
Jul 28 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 intval的测试代码发现问题
2008/07/27 PHP
PHP实时显示输出
2008/10/02 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
python3实现单目标粒子群算法
2019/11/14 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
python用什么编辑器进行项目开发
2020/06/17 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
会计工作态度自我评价
2015/03/06 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫