Ref:

https://www.jianshu.com/p/6f8576a37a3e

https://blog.csdn.net/Demo_3/article/details/78119951

https://blog.csdn.net/spur_man/article/details/79550917

https://my.oschina.net/37Y37/blog/1920149

http://docs.jinkan.org/docs/celery/getting-started/next-steps.html

https://www.ctolib.com/topics-130539.html#


为什么选择Celery

当前的需求是:我用form从前端拿到了提交的数据,由于需要处理一点时间(也许很多用户同时提请求呢)虽然感觉暂时想多了=.=

如果处理时间过长,那么一方面页面可能会超时,另一方面,用户等待太久也是不合适的。所以现在希望,在用户提交数据后,立刻就

能收到一个回复(比如说task ID),等到任务结束后,通知用户,用这个ID就可以获取结果(当然可以是服务器靠这个ID来输出结果)。

我也考虑过用ajax直接部分刷新页面,但是感觉对于长时间的并发任务,可能不是很合适(看到的ajax例子都是很简单的,不是很懂是不是不适合复杂的计算逻辑?)。总之,为了以后的发展,还是学一下水芹菜吧。

概念

Celery 的基本架构采用典型的生产者—消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。Celery自己不提供消息服务,但是可以和提供消息服务的中间件集成。这里推荐的broker有RabbitMQ(官网推荐)和Redis。Workers可以并发地运行在分布式的节点上。
实际应用时,用户从 Web 前端发起一个请求,然后将请求所要处理的任务丢入 broker中,由空闲的 worker 去处理,处理的结果会暂存在后台数据库 backend 中。
处理场景

异步任务处理:例如给注册用户发送短消息或者确认邮件任务。

大型任务:执行时间较长的任务,例如视频和图片处理,添加水印和转码等,需要执行任务时间长。

定时执行的任务:支持任务的定时执行和设定时间执行。例如性能压测定时执行。

安装

pip install celery

为了让celery中执行任务的结果返回Django,再装一个

sudo pip install django-celery-results

使用redis做broker和backend,安装:

sudo apt-get install redis
sudo pip install redis

如果apt-get有错误,请用下面的命令

sudo apt-get install redis --fix-missing

开启redis服务

redis-server

报错

我就知道不会一帆风顺的:)

解决:1. 找到redis-server进程,kill

2. 接着发现redis-server进程仍然存在,杀不掉:)

所以使用停止服务的命令。必要的话要用sudo。

/etc/init.d/redis-server stop

然后再重启redis-service即可

现在正式来写Celery了。首先看一下目录结构:

配置阶段先改celery.py和__init__.py

# Celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms # set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'probe.settings') app = Celery('probe') # Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django app configs.
app.autodiscover_tasks() # Allow root user run celery
platforms.C_FORCE_ROOT = True @app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

__init__.py

from __future__ import absolute_import, unicode_literals

# 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 __all__ = ['celery_app']

然后进入根目录

celery worker -A probe -l info

你以为这样就可以了?报错:

这是因为我们的水芹找不到redis啊:)所以要修改上面的celery.py

# redis是broker和backend
app = Celery('probe', backend='redis', broker='redis://localhost')

现在来配置一下celery。上面的修改暂时取消,我们统一在settings.py里配置celery。

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYD_MAX_TASKS_PER_CHILD = '1'

# celery在长时间运行后可能出现内存泄漏,需要添加这个配置,表示每个worker执行了多少个任务就死掉

# INSTALLED_APPS里再添加一个'django_celery_results'

然后migrate一下变化

python manage.py migrate django_celery_results

现在来真正写任务了:task.py

这个task.py在每个app下都要有,而且名称不能改变。

from __future__ import absolute_import, unicode_literals
from celery import shared_task @shared_task
def longtime_test():
# 在这里写操作

然后在views.py里(我这里是把design2.py和主页design-post绑在一起的,所以我写到design2.py里去)

longtime_test.delay()

补一刀:

在design2.py里,我这么写(省略其他)这里只是简单测试一下:

import task

def design_post(request):
...
if request.POST:
result = task.longtime_test.delay(ctx['target_definition'], ctx['target_species'])
while True:
if result.ready():
print "celery fried!"
break;
...

事实上我第一次遇到了报错

当时写的是from task import longtime_test

我改成上面的写法之后,重启celery,就没有报错:celery正确输出字符串(毕竟我只做了字符串连接啊摊手)

而且django后台这里也正确反馈了(黄色标识)红色的是之前报错状态的显示。因为longtime_test函数一样返回了,所以还是会跳出循环。

好了我现在要去写业务代码了,配置方面的任务暂时告一段落:)

django开发傻瓜教程-3-celery异步处理的更多相关文章

  1. django开发傻瓜教程-1-安装和HelloWorld

    安装 sudo pip install Django 新建项目 django-admin startproject XXX 启动项目 进入主目录下 python manage.py runserver ...

  2. django开发新手教程(原创)

    为了帮助新手简单高效解决django开发的问题,从而写了这么一篇,随便转载! 本人用的是windows10操作系统 #联网安装 ==指定版本号      我在自定义的www文件夹安装C:\Users\ ...

  3. Django使用Celery异步任务队列

    1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...

  4. Django --- celery异步任务与RabbitMQ模块

    一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...

  5. Django框架中,使用celery实现异步

    作用:在使用框架时,在视图函数中实现异步构成: 任务task:一段耗时并与响应结果无关的代码,如发短信 工人worker:新进程,用于执行任务代码 代理人broker:调用任务时,将任务添加到队列中, ...

  6. Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步

    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...

  7. django celery异步框架

    描述:实现运维平台的异步执行与定时任务,以下简单描述了安装过程及使用.   安装django和celery pip install django pip install celery pip inst ...

  8. Django之使用celery异步完成发送验证码

    使用celery的目的:将项目中耗时的操作放入一个新的进程实现 1.安装celery pip install celery 2.在项目的文件夹下创建包celery_tasks用于保存celery异步任 ...

  9. django、celery异步发邮件

    django.celery异步发邮件 django自带的send_mail发邮件功能执行发邮件功能会因为网络的原因造成花费的时间过长,为了解决这个问题,可以用celery + redis代替 安装包: ...

随机推荐

  1. webstorm 2017.1 破译

    安装完webstorm后, 在弹出的注册窗口选择 activate > license server > 在 License server address 里输入 "http:/ ...

  2. ant用法

    下载ant包,解压版,解压到某目录后配置环境变量即可,这里不在赘述.配置成功cmd ant-version,显示ant版本即OK.           ant是Apache的跨平台的构建工具,他可以实 ...

  3. 视频监控——从其他浏览器打开低版本IE方案

    1. 方案背景 由于低版本IE浏览器并不支持很多新的页面技术,导致部分页面效果难以实现;另一方面IE浏览器版本与操作系统绑定,难以统一,不同版本IE间的不兼容导致多种兼容性问题,因此本项目暂定采用Ch ...

  4. Python对数组的基本操作

    # coding=utf-8创建并打印数组'''arr = ["aex", "bfe", "mpilgrim", "zddd&qu ...

  5. Visual Studio 快捷键汇总

    常见方法: 强迫智能感知:Ctrl+J.智能感知是Visual Studio最大的亮点之一,选择Visual Studio恐怕不会没有这个原因.  撤销:Ctrl+Z.除非你是天才,那么这个快捷键也是 ...

  6. 别跑了,看看脚下有木有money

       别跑了,看看脚下有木有money 1.长大论坛   本来是想做个博客的,无奈级别不够,博客过于复杂,所以就做了这个类似于贴吧的东西.在这里,你可以发帖:可以吐槽学校.可以向他人寻求帮助.甚至可以 ...

  7. Locust性能测试3 no-web运行

    Locust也支持no-web的方式运行,直接通过控制台设置并发用户数.每秒启动用户数.持续压测时间. locust -f 脚本路径 -c 用户数 -r 每秒启动用户数 --run-time 持续压测 ...

  8. Windos下Android(ADT Bundle)配置NDK的两种方法------ADT、Cygwin、NDK配置汇总(转)

    转自:http://blog.csdn.net/yanzi1225627/article/details/16897877 Android开发环境由windows下ADT Bundle搭建,且按前文h ...

  9. bzoj2004 [Hnoi2010]公交线路

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...

  10. Android开发学习之TabView选项卡具体解释 -- 基于Android4.4

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/he90227/article/details/24474197 直接上代码 -- 基于Android ...