以下需求场景很常见:

1. 用户点击页面按钮,请求后台进行一系列耗时非常高的操作,页面没有响应/一直Loading,用户体验非常不好。

2. 某些数据需要预先处理,每天凌晨的时候进行运算,大约半小时到1小时才能完成。

3. 进行外部系统的接口数据调用,接口要求在10秒内返回应答报文,但是Django获取数据之后要进行一定的处理,而此处理时间超过3分钟。

基于以上场景,就需要对站点进行异步任务 / 定时任务的处理了。

因为Django接受到请求之后,会阻塞进程,此过程未处理完毕,就无法响应反馈。

解决方案有很多,这里说说我觉得稍微靠谱的思路:

1. 先说针对定时任务,这种解决方案比较多,可以将程序书写成 manage common的方式进行,然后使用crontab调用命令即可

或者使用celery,也采用crontab的方式进行调用。

2. 异步任务,目前比较靠谱的就是celery了。

综上,这里就使用celery的方式进行,manage common的方式改天尝试之后再发文。

python组件:

1. python2.7

2. Django1.7.1

3. celery( amqp-1.4.9 anyjson-0.3.3 billiard-3.3.0.22 celery-3.1.20 )    #使用pip install celery会自定把这些都装上,默认安装符合依赖的最新版。

4. django-celery-3.1.17    #还是用pip装,这个是用来支持结果写入数据库的。

步骤:

备注:以下内容,顶行书写是终端/命令行命令; #表示注释,实际运行请不要加入; python语法高亮均为文件中的内容; >>> 开头表示终端/命令行方式进入python执行的命令。

1. 新建django project:

django-admin startproject django_celery

cd django_celery

django-admin startapp demoapp

2. 新建celery配置:(详情看文末的解释)

django_celery/django_celery/celery.py:

 from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings # set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings') app = Celery('django_celery') # Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

3. 设置导入celery实例:

修改django_celery/django_celery/__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

4. 新建demo tasks:

django_celery/demoapp/tasks.py:

    from __future__ import absolute_import
from celery import shared_task @shared_task
def add(x, y):
return x + y @shared_task
def mul(x, y):
return x * y @shared_task
def xsum(numbers):
return sum(numbers)

5. 修改项目配置:

一、django_celery/django_celery/settings.py:

1)【可选】屏蔽不需要的app:admin、auth、contenttypes、sessions、messages、staticfiles。

2)增加app:'demoapp','djcelery','kombu.transport.django', :

 INSTALLED_APPS = (
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
# 'django.contrib.staticfiles',
'demoapp',
'djcelery',
'kombu.transport.django',
)

3)增加 broker 配置:

BROKER_URL = 'django://localhost:8000//'

二、django_celery/django_celery/urls.py:

1)【可选】既然都去掉了admin了,那么就把admin的相关内容注释掉:

        from django.conf.urls import patterns, include, url
# from django.contrib import admin urlpatterns = patterns('',
# Examples:
# url(r'^$', 'django_celery.views.home', name='home'),
# url(r'^blog/', include('blog.urls')), # url(r'^admin/', include(admin.site.urls)),
)

6. 准备就绪,检查当前目录结构:

  django_celery
│ db.sqlite3
│ manage.py
│ manage.pyc

├─demoapp
│ │ admin.py
│ │ models.py
│ │ models.pyc
│ │ tasks.py
│ │ tasks.pyc
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │ __init__.pyc
│ │
│ └─migrations
│ __init__.py
│ __init__.pyc

└─django_celery
celery.py
celery.pyc
settings.py
settings.pyc
urls.py
wsgi.py
wsgi.pyc
__init__.py
__init__.pyc

执行命令进行测试:

python manage.py syncdb                      #同步数据库,仅首次运行

python managepy runserver                    #运行站点,默认端口8000

【新终端/命令行】

python manage.py celery worker -l info        #开启celery worker 进程

【另一个新终端/命令行】

python manage.py shell

>>> from demoapp.tasks import *
>>> dir()
['__builtins__', 'absolute_import', 'add', 'mul', 'shared_task', 'xsum']
>>> mul(5,2) #可以看到,直接执行命令是没有问题的,直接返回。
10
>>> mul.delay(5,2) #采用delay方式执行,会发送任务到worker
<AsyncResult: 2922623d-e89b-48c1-a355-bc8d566d10e7>
>>> add.delay(2,3)
<AsyncResult: e07aea9b-86da-4d84-89c7-768aca076b53>

运行结果(在worker终端/命令行中查看):

[2016-01-27 17:58:56,418: INFO/MainProcess] Received task: demoapp.tasks.mul[2922623d-e89b-48c1-a355-bc8d566d10e7]
[2016-01-27 17:58:56,437: INFO/MainProcess] Task demoapp.tasks.mul[2922623d-e89b-48c1-a355-bc8d566d10e7] succeeded in 0.0169999599457s: 10
[2016-01-27 18:00:46,618: INFO/MainProcess] Received task: demoapp.tasks.add[e07aea9b-86da-4d84-89c7-768aca076b53]
[2016-01-27 18:00:46,630: INFO/MainProcess] Task demoapp.tasks.add[e07aea9b-86da-4d84-89c7-768aca076b53] succeeded in 0.0100002288818s: 5

至此,demo结束。

【此部分内容仅研究使用,时间较忙无需关心】

1. 下面讲解一下celery.py文件的配置内容,为何要这么配置。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings')
设置这个环境变量是为了让 celery 命令能找到 Django 项目。这条语句必须出现在 Celery 实例创建之前。

app = Celery('django_celery')
这个 app 就是 Celery 实例。可以有很多 Celery 实例,但是当使用 Django 时,似乎没有必要。

app.config_from_object('django.conf:settings')

可以将 settings 对象作为参数传入,但是更好的方式是使用字符串,因为当使用 Windows 系统或者 execv 时 celery worker 不需要序列化 settings 对象。

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

为了重用 Django APP,通常是在单独的 tasks.py 模块中定义所有任务。Celery 会自动发现这些模块,加上这一句后,Celery 会自动发现 Django APP 中定义的任务,前提是遵循如下 tasks.py 约定:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

2. 关于broker:

这个是个什么东西,我还是不太理解,按照seeting的配置来说,我理解就是承载的站点。

BROKER_URL = 'django://localhost:8000//'

这里要注意我是使用了django自带的broker来作为celery broker,传说可以选的broker有:

RabbitMQ
Redis
database

参考文献:

1. Celery 3.1 中文文档:Django

2. First Steps with Celery

作者:samsample
来源:CSDN
原文:https://blog.csdn.net/samed/article/details/50598371

Django搭配Celery进行异步/定时任务(一)初步搭建的更多相关文章

  1. Django使用Celery进行异步任务

    Celery Celery是一个功能完备即插即用的异步任务队列系统.它适用于异步处理问题,当发送邮件.或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用 ...

  2. Django配置celery执行异步任务和定时任务

    原生celery,非djcelery模块,所有演示均基于Django2.0 celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线 ...

  3. Django与Celery配合实现定时任务

    一.前言 Celery是一个基于python开发的分布式任务队列,而做python WEB开发最为流行的框架莫属Django,但是Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务 ...

  4. Django 使用 Celery 实现异步任务

    对于网站来说,给用户一个较好的体验是很重要的事情,其中最重要的指标就是网站的浏览速度.因此服务端要从各个方面对网站性能进行优化,比如可采用CDN加载一些公共静态文件,如js和css:合并css或者js ...

  5. django 使用celery 实现异步任务

    celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...

  6. Django+Celery 执行异步任务和定时任务

    celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度.采用典型的生产者-消费者模型,主要由三部分组成: 1. 消 ...

  7. celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决

    今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...

  8. django —— Celery实现异步和定时任务

    1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...

  9. Django 1.9 + celery + django-celry 实现定时任务

    celery可以进行任务异步处理,celery还有一种Celery的常用模式便是执行定期任务. 执行定期任务时, Celery会通过celerybeat进程来完成. Celerybeat会保持运行, ...

随机推荐

  1. 【转】Linux中/etc/profile,/etc/bashrc,~/.profile,~/.bashrcd的区别

    //因为在原文章中博主说以下内容是网友说的,所以我就只加个转了,找不到原作者 /etc/profile,/etc/bashrc 是系统全局环境变量设定 ~/.profile,~/.bashrc用户家目 ...

  2. 一款可以安利的MarkDown编辑器

    Typeora一款可以安利的MarkDown编辑器 Typeora是什么? ​ 一款使用MarkDown的本地编辑器集结了MarkDown的所有特点并展现了简洁.高效的特点,关键是免费. 特点: 支持 ...

  3. imooc课程:Java高并发秒杀API 记录

    Java高并发秒杀API之业务分析与DAO层 Java高并发秒杀API之Service层 Java高并发秒杀API之web层 Java高并发秒杀API之高并发优化 除了并发部分外的这个web开发的总结 ...

  4. good pics

  5. SAP Fiori + Vue = ?

    2017年3月28日,我到国内一个SAP CRM客户那里,同他们的架构师关于二次开发的UI框架选择SAP UI5还是Vue进行了一番探讨.回到SAP研究院之后,我把这个问题扔到了公司的微信群里,引起了 ...

  6. Radmin自动连接 c#版 带源码

    实现原理:1.利用radminview 自带命令 2.大漠绑定插件. 附图: 源码下载:http://files.cnblogs.com/eastday/Radmin%E8%87%AA%E5%8A%A ...

  7. getResource和getResourceAsStream

    1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...

  8. bzoj2336 [HNOI2011]任务调度

    Description 正解:搜索+随机化. 先写个搜索,枚举所有没有要求的任务属于哪一种任务,然后再用爬山来更新最优解. 具体来说就是先把所有先做任务$A$的按照$a$时间从大到小排序,先做任务$B ...

  9. django 静态文件

    django 1.8版本以上 django 静态文件配置. 小作之前, 一直觉得django的静态文件配置非常的麻烦. 1. 要设置url(r'^static/(?P<path>.*)&a ...

  10. 数据元&数据字典&元数据

    1. 数据元 data element(数据元素),单个数据单元,是数据的基本单位.参阅data field(数据字段). 2. 元数据 首先,我们举个例子来看看什么叫做“元”,在后现代主义文学中有一 ...