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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
深入理解Django的中间件middleware
Mar 14 Python
将python文件打包成EXE应用程序的方法
May 22 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
使用Pytorch训练two-head网络的操作
May 28 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
HTML的select控件美化
2017/03/27 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
社区端午节活动方案
2014/01/28 职场文书
根叔历年演讲稿
2014/05/20 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby
python通过新建环境安装tfx的问题
2022/05/20 Python
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python