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调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python中的集合类型知识讲解
Aug 19 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python 阶乘累加和的实例
Feb 01 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
Python实现最常见加密方式详解
Jul 13 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
Python实现随机取一个矩阵数组的某几行
Nov 26 Python
python函数map()和partial()的知识点总结
May 26 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
晶体管单管来复再生式收音机
2021/03/02 无线电
NOT NULL 和NULL
2007/01/15 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
Django使用rest_framework写出API
2020/05/21 Python
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
大学毕业的自我鉴定
2013/10/08 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
2014年检验员工作总结
2014/11/19 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
狂人日记读书笔记
2015/06/30 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers