django 使用celery 实现异步任务

celery

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

使用celery后,情况就不一样了。解决:将耗时的程序放到celery中执行。

celery官方网站: href="http://www.celeryproject.org/

celery中文文档: href="http://docs.jinkan.org/docs/celery/

celery名词:

  • 任务task:就是一个Python函数。
  • 队列queue:将需要执行的任务加入到队列中。
  • 工人worker:在一个新进程中,负责执行队列中的任务。
  • 代理人broker:负责调度,在布置环境中使用redis。

示例中使用到的安装包版本

celery==3.1.25
django-celery==3.1.17

示例

1)在应用question_help/views.py文件中创建视图sayhello。

import time

def sayhello(request):
    print(‘hello ...‘)
    time.sleep(2)
    print(‘world ...‘)
    return HttpResponse("hello world")

2)在question_help/urls.py中配置。

    url(r‘^sayhello$‘,views.sayhello),

3)启动服务器,在浏览器中输入如下网址:

http://127.0.0.1:8000/sayhello/

4)在终端中效果,两次输出之间等待一段时间才会返回结果。

5)在settings.py中注册celery应用

INSTALLED_APPS = (
  ...
  ‘djcelery‘,
}

6)在settings.py文件中配置代理和任务模块。

import djcelery
djcelery.setup_loader()
BROKER_URL = ‘redis://127.0.0.1:6379/2‘ 

7)在应用question_help/目录下创建tasks.py文件。

import time
from celery import task

@task
def sayhello():
    print(‘hello ...‘)
    time.sleep(2)
    print(‘world ...‘)

8)打开question_help/views.py文件,修改sayhello视图如下:

from booktest import tasks
...
def sayhello(request):
    # print(‘hello ...‘)
    # time.sleep(2)
    # print(‘world ...‘)
    tasks.sayhello.delay()
    return HttpResponse("hello world")

9)执行迁移生成celery需要的数据表。

python manage.py migrate

生成表如下:

10)启动Redis,如果已经启动则不需要启动。

sudo service redis start

11)启动worker。

python manage.py celery worker --loglevel=info

启动成功后提示如下图:

11)打开新终端,进入虚拟环境,启动服务器,刷新浏览器。 在旧终端中两个输出间仍有时间间隔。

运行完成后如下图,注意两个终端中的时间,服务器的响应是立即返回的。

原文地址:https://www.cnblogs.com/lowmanisbusy/p/9384844.html

时间: 2024-11-09 06:24:20

django 使用celery 实现异步任务的相关文章

Django使用Celery异步任务队列

1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收的工作任务,这个功能依赖于消息队列(MQ.Redis). 1.1  Celery原理 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成. 消息中间件:Celery本身不提供消息服务,但

django、celery异步发邮件

django.celery异步发邮件 django自带的send_mail发邮件功能执行发邮件功能会因为网络的原因造成花费的时间过长,为了解决这个问题,可以用celery + redis代替 安装包: pip install celery pip install redis 在django的根目录下新建celery_tasks文件夹,在该文件夹下新建tasks.py: 1 from celery import Celery 2 from django.conf import settings 3

django使用celery异步发送短信

1. 安装celery模块 pip install -U celery==4.3.0 2. 创建celery相关目录 xiaolan/ # 项目主目录 ├── mycelery/ ├── config.py # 配置文件 ├── __init__.py ├── main.py # 主程序 └── sms/ # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖 └── tasks.py # 任务的文件,名称必须是这个 3. 创建celery配置文件config.py # 注意:

Django的celery配置(包括定时任务、队列)

一.安装celery Django项目不需要安装celery这个包,可以直接使用django-celery这个包,,先来安装它,在终端中输入: pip install django-celery 二.安装rabbitmq,建立celery队列 我做的项目用的就是rabbitmq,按道理来说,也是可以用redis作为消息队列的,但是rabbitmq更好,此处不做详细解释,有兴趣的同学的可以去研究下. ubuntu环境下,在终端中输入: sudo apt-get install rabbitmq-s

celery执行异步任务和定时任务

一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成. 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成.包括,RabbitMQ, Redis等等 任务执行单元 Worker是Celery提供

django+django-celery+celery的整合实战

django+django-celery+celery的整合 本篇文章主要是由于计划使用django写一个计划任务出来,可以定时的轮换值班人员名称或者定时执行脚本等功能,百度无数坑之后,终于可以凑合把这套东西部署上.本人英文不好,英文好或者希望深入学习或使用的人,建议去参考官方文档,而且本篇的记录不一定正确,仅仅实现crontab 的功能而已.希望深入学习的人可以参考http://docs.jinkan.org/docs/celery/.首先简单介绍一下,Celery 是一个强大的分布式任务队列

Django使用Celery自动更新缓存

目录 Celery 官网: Celery架构 使用场景 Celery的安装配置 Celery执行异步任务 包架构封装: 基本使用: 高级使用: django中使用 Celery 官网: Celery 官网: http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/

Django中Celery的实现

Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Celery介绍 Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. 上图展示的是Celery的架构,它采用典型的生产者-消费者模式,主要由三部分组成:broker(消息队列).workers(消费者:处理任务).backend(存储结果). 消息中间件:Celery本

Django使用celery异步发邮件

Celery是Python开发的分布式任务调度模块,包含以下组件: Celery Beat: 任务调度器,自带的 Celery Worker: 执行任务的消费者,通常设置多个 Broker: 消息代理,就是任务队列,我们使用redis Producer: 任务生产者,要执行的函数加上@app.task Result Backend: 结果保存,还是redis Celery安装 1 pip install celery[redis] 还要安装redis 1 wget http://download