Django异步任务之Celery的基本使用


Posted in Python onMarch 23, 2019

Celery

许多Django应用需要执行异步任务, 以便不耽误http request的执行. 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好. Celery不仅能在Django中使用, 还能在其他地方被大量的使用. 因此一旦学会使用Celery, 我们可以很方便的在其他项目中使用它.

celery 是一个用于实现异步任务的库, 在很多项目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在实现 http request请求返回 view 前做一些我们想做的而且耗时的事情而不会让用户等待太久

环境

django 版本 == 1.11.6

celery 版本 == 3.1.25

安装

pip install django-celery
pip install celery

首先需要将 celery 添加到 django 项目的 settings 里, celery 任务和 django 需要一个 中间人(broker),,这里使用的是 django 自带的 broker, 但在生产中一般使用 rabbitmq, Redis 等,在 INSTALLED_APP 中需要添加 djcelery 和 kombu.transport.django, 还有 app 应用。

- project/project/ settings.py:

import djcelery

djcelery.setup_loader() 
BROKER_URL = 'django://'

INSTALLED_APP = (
 ...
 'app'
 'djcelery',
 'kombu.transport.django',
)

新建 celery.py 创建一个 celery 应用,并添加以下内容

- project/project/ celery.py:

# 相对路径导入, 防止导入 celery 时冲突
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

# 让 celery 能找到 django 项目
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
# 创建一个 celery 应用
app = Celery('project')

# 导入配置
app.config_from_object('django.conf:settings')
# 自动发现 task
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):

 print('Request: {0!r}'.format(self.request))

 

- project/project/ __init__.py:

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

在 django app 中添加任务,文件名必须是 tasks.py, 在普通 python 函数前加一个 @task() 装饰器就变成了 celery task

-project/app/ tasks.py:

from celery.task import task
from time import sleep

@task()
def helloWorld():
 print 'helloWorld'
 sleep(10)
 print 'helloWorld'
 return 'helloCelery'

这样,一个任务就创建成功了,只剩下在 view 中调用了

-project/app view.py:

from tasks.py import helloWorld

def home():

 helloWorld.delay()

 return HttpResponse('helloCelery')

最后

python manage.py migrate

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
基于python 处理中文路径的终极解决方法
Apr 12 Python
python 读入多行数据的实例
Apr 19 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
python实现BP神经网络回归预测模型
Aug 09 Python
python动态视频下载器的实现方法
Sep 16 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
Python list运算操作代码实例解析
Jan 20 Python
你可能不知道的Python 技巧小结
Jan 29 Python
Python3 元组tuple入门基础
Feb 09 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
深入解析Python小白学习【操作列表】
Mar 23 #Python
Python基础之条件控制操作示例【if语句】
Mar 23 #Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 #Python
详解python中sort排序使用
Mar 23 #Python
Python基础之函数的定义与使用示例
Mar 23 #Python
详解用Python练习画个美队盾牌
Mar 23 #Python
详解python中TCP协议中的粘包问题
Mar 22 #Python
You might like
php判断正常访问和外部访问的示例
2014/02/10 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python操作qml对象过程详解
2019/09/26 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python+OpenCV实现图像拼接
2020/03/05 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
英国电器零售商:PRC Direct
2018/06/21 全球购物
乡镇交通安全实施方案
2014/03/29 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
校园开放日新闻稿
2015/07/17 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
无线电知识基础入门篇
2022/02/18 无线电
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android