以下需求场景很常见:

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. Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)

    一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...

  2. 【Leetcode】【Medium】Repeated DNA Sequences

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  3. 实现UILabel渐变色效果

    实现UILabel渐变色效果 效果如下图: 源码: // // CombinationView.h // ChangeColorLabel // // Created by YouXianMing o ...

  4. Jenkins在deploy maven artifact时报Peer not authenticated.

    这是一起由Nexus证书导入错误造成的Jenkins运行异常. 最近,同事修改了Nexus服务器的host name,结果导致Jenkins里的任务全都执行不了了.虽然job的配置都已经更新指向新的N ...

  5. Lovable eccentric

    It took him four years to stage this elaborate joke simply to prove that critics do not always know ...

  6. ZT 骆家辉宣布辞职 他给中国带来什么留下什么?

    骆家辉宣布辞职 他给中国带来什么留下什么? 字号|2013年11月20日 15:20    已有1933人阅读    57 导 读 美国驻华大使骆家辉20日上午发表声明,宣布辞职.骆家辉履任期间为中国 ...

  7. IBM websphere MQ远程队列的简单配置

    原理: 1.远程队列分发送方和接收方 2.接收方配置: 接收方配置要先拿到对方的发送通道配置,接收方的队列名称必须和远程发送方的队列名称一致,告诉远程发送方,你的地址,队列管理器名称等信息,在通道中建 ...

  8. Tomcat组件启动流程图

    看到一张关于Tomcat组件启动流程图,觉得还可以,收藏.

  9. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. Kali-linux应用更新和配置额外安全工具

    本节将介绍更新Kali的过程和配置一些额外的工具.这些工具在后面的章节中将是有用的.Kali软件包不断地更新和发布之间,用户很快发现一套新的工具比最初在DVD ROM上下载的软件包更有用.本节将通过更 ...