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 相关文章推荐
详解Django中的form库的使用
Jul 18 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
python记录程序运行时间的三种方法
Jul 14 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
python分数表示方式和写法
Jun 26 Python
python 动态调用函数实例解析
Oct 21 Python
Python多线程通信queue队列用法实例分析
Mar 24 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
python中使用np.delete()的实例方法
Feb 01 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/13 PHP
浅谈php扩展imagick
2014/06/02 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
PyQt5每天必学之组合框
2018/04/20 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
外贸英语毕业生自荐信
2013/11/14 职场文书
毕业生就业自荐书
2013/12/15 职场文书
运动会稿件50字
2014/02/17 职场文书
无毒社区工作方案
2014/05/23 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
浅谈Python numpy创建空数组的问题
2021/05/25 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android