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中将字典转换成其json字符串
Jul 16 Python
跟老齐学Python之集合(set)
Sep 24 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
Pycharm更换python解释器的方法
Oct 29 Python
python修改txt文件中的某一项方法
Dec 29 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
Python 私有化操作实例分析
Nov 21 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python深度学习之实现卷积神经网络
Jun 05 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
ThinkPHP标签制作教程
2014/07/10 PHP
php实现分页显示
2015/11/03 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
PHP 图片处理
2020/09/16 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
查看django版本的方法分享
2018/05/14 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python程序慢的重要原因
2020/09/04 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
可口可乐广告词
2014/03/20 职场文书
初三班主任寄语大全
2014/04/04 职场文书