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实现的文件同步服务器实例
Jun 02 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
Python数据类型详解(一)字符串
May 08 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
Mac安装python3的方法步骤
Aug 09 Python
django删除表重建的实现方法
Aug 28 Python
Python操作qml对象过程详解
Sep 26 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 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中去除所有js,html,css代码
2010/10/12 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
JavaScript File分段上传
2016/03/10 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
简单介绍Python中的decode()方法的使用
2015/05/18 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
Python闭包思想与用法浅析
2018/12/27 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
python制作填词游戏步骤详解
2019/05/05 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
房产买卖委托公证书
2014/04/04 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
实施意见格式范本
2015/06/05 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
新手入门Mysql--概念
2021/06/18 MySQL
MySQL约束超详解
2021/09/04 MySQL
Python socket如何解析HTTP请求内容
2022/02/12 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python