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 05 Python
python3访问sina首页中文的处理方法
Feb 24 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
利用python批量检查网站的可用性
Sep 09 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
python3 简单实现组合设计模式
Jul 02 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 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
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
python编程实现归并排序
2017/04/14 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
TCP/IP的分层模型
2013/10/27 面试题
《长相思》听课反思
2014/04/10 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
大学生毕业求职信
2014/06/12 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
党支部审查意见
2015/06/02 职场文书
分家协议书范本
2016/03/22 职场文书
标准发言稿结尾
2019/07/18 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技