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的一些用法分享
Oct 07 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
Flask配置Cors跨域的实现
Jul 12 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
Django中F函数的使用示例代码详解
Jul 06 Python
Python中如何处理常见报错
Jan 18 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数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php中strtotime函数性能分析
2016/11/20 PHP
一行代码告别document.getElementById
2012/06/01 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
英语演讲稿范文
2014/01/03 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
团日活动总结模板
2014/06/25 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技