Django 中使用 Celery
起步
在 《分布式任务队列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的更多相关文章
- Django中使用Celery实现定时任务(用djcelery)
一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...
- Python—在Django中使用Celery
一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...
- celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决
今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...
- Django中使用Celery
一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...
- Celery简介以及Django中使用celery
目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...
- Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...
- 四、Django中使用celery
项目跟目录创建celery包,目录结构如下: mycelery/ ├── config.py ├── __init__.py ├── main.py └── sms/ ├── __init__.py ...
- Django项目中使用celery做异步任务
异步任务介绍 在写项目过程中经常会遇到一些耗时的任务, 比如:发送邮件.发送短信等等~.这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行 celery就是用于处理 ...
- celery在Django中的应用
这里不解释celery,如果不清楚可以参考下面链接: http://docs.celeryproject.org/en/latest/getting-started/introduction.html ...
随机推荐
- Fiddler死活抓不了HTTPS包解决办法
Fiddler抓取HTTPS设置注意以下操作的前提是,手机已经能够连上Fiddler,这部分的配置过程简单就不赘述了,可参考:手机如何连接Fiddler . 如何继续配置让Fiddler抓取到HTTP ...
- How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7
How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7 $ Solution 已验证 - 已更新2017年六月 ...
- VUE-007-通过路由 router.push 传递 query 参数(路由 name 识别,请求链接显示参数传递)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- JVM深入:JVM内存堆布局图解分析(转)
转载自:https://www.cnblogs.com/SaraMoring/p/5713732.html 原文:http://www.codeceo.com/article/jvm-memory-s ...
- iOS 字体下载
iOS可以动态的为系统下载字体,这些字体都下载到了系统的目录下,并且可以被其他应用公用 来看下如何实现动态下载: // 创建下载字体请求描述的准备 NSMutableDictionary *attrs ...
- TCP/IP协议 数据链路层
以太网 1.以太网(Ethernet)是一种计算机局域网技术,由Xerox.Intel公司在1982年联合开发的技术规范. 2.IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包 ...
- mybatis 分页插件
博客地址http://www.jianshu.com/nb/5226994 引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的 ...
- 文件中间修改内容遇到OSEerror
for i in f: 实际上是一直在调用 f.next() .(表明在交互模式下不能使用f.tell())从报错来看,是说 f.next() 方法被调用的时候,f.tell() 方法不可以被调用.
- SpringMVC和Struts2的区别及优势
1.SpringMVC和Struts2的区别比较 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...
- FG面经: Interval问题合集
How to insert interval to an interval list. List is not sorted O(N) solution: package fb; import jav ...