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 Web框架
Mar 20 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
Python中return self的用法详解
Jul 27 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
django框架创建应用操作示例
Sep 26 Python
python列表推导式入门学习解析
Dec 02 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
浅谈怎么给Python添加类型标注
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代码书写习惯优化小结
2013/06/20 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
php 中的closure用法详解
2017/06/12 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
Javascript中的作用域及块级作用域
2017/12/08 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
python实现统计代码行数的方法
2015/05/22 Python
Python实现随机选择元素功能
2017/09/14 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
python tkinter canvas使用实例
2019/11/04 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
大学生如何写自荐信
2014/01/08 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Node与Python 双向通信的实现代码
2021/07/16 Javascript
php去除deprecated的实例方法
2021/11/17 PHP
Python中requests库的用法详解
2022/06/05 Python