前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务。在同事的指引下接触了Celery这个异步任务队列框架,鉴于网上关于Celery和Django结合的文档较少,大部分也只是粗粗介绍了大概的流程,在实践过程中还是遇到了不少坑,希望记录下来帮助有需要的朋友。
一、Django中的异步请求
Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 -- http handling(request解析) -- url mapping(url正则匹配找到对应的View) -- 在View中进行逻辑的处理、数据计算(包括调用Model类进行数据库的增删改查)--将数据推送到template,返回对应的template/response。
图1. Django架构总览
同步请求:所有逻辑处理、数据计算任务在View中处理完毕后返回response。在View处理任务时用户处于等待状态,直到页面返回结果。
异步请求:View中先返回response,再在后台处理任务。用户无需等待,可以继续浏览网站。当任务处理完成时,我们可以再告知用户。
二、关于Celery
Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。
图2. Celery架构
图2展示的是Celery的架构,它采用典型的生产生-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。实际应用中,用户从Web前端发起一个请求,我们只需要将请求所要处理的任务丢入任务队列broker中,由空闲的worker去处理任务即可,处理的结果会暂存在后台数据库backend中。我们可以在一台机器或多台机器上同时起多个worker进程来实现分布式地并行处理任务。
三、Django中Celery的实现
在实际使用过程中,发现在Celery在Django里的实现与其在一般.py文件中的实现还是有很大差别,Django有其特定的使用Celery的方式。这里着重介绍Celery在Django中的实现方法,简单介绍与其在一般.py文件中实现方式的差别。
1. 建立消息队列
首先,我们必须拥有一个broker消息队列用于发送和接收消息。Celery官网给出了多个broker的备选方案:RabbitMQ、Redis、Database(不推荐)以及其他的消息中间件。在官网的强力推荐下,我们就使用RabbitMQ作为我们的消息中间人。在Linux上安装的方式如下:
sudo apt-get install rabbitmq-server
命令执行成功后,rabbitmq-server就已经安装好并运行在后台了。
另外也可以通过命令rabbitmq-server来启动rabbitmq server以及命令rabbitmqctl stop来停止server。
更多的命令可以参考rabbitmq官网的用户手册:https://www.rabbitmq.com/manpages.html
2. 安装django-celery
pip install celery
pip install django-celery
3. 配置settings.py
首先,在Django工程的settings.py文件中加入如下配置代码:
import djcelery
djcelery.setup_loader()
BROKER_URL= 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
其中,当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。BROKER_URL和CELERY_RESULT_BACKEND分别指代你的Broker的代理地址以及Backend(result store)数据存储地址。在Django中如果没有设置backend,会使用其默认的后台数据库用来存储数据。注意,此处backend的设置是通过关键字CELERY_RESULT_BACKEND来配置,与一般的.py文件中实现celery的backend设置方式有所不同。一般的.py中是直接通过设置backend关键字来配置,如下所示:
app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
然后,在INSTALLED_APPS中加入djcelery:
INSTALLED_APPS = (
……
'qv',
'djcelery'
……
)
4. 在要使用该任务队列的app根目录下(比如qv),建立tasks.py,比如:
在tasks.py中我们就可以编码实现我们需要执行的任务逻辑,在开始处import task,然后在要执行的任务方法开头用上装饰器@task。需要注意的是,与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名。
5. 生产任务
在需要执行该任务的View中,通过build_job.delay的方式来创建任务,并送入消息队列。比如:
6. 启动worker的命令
#先启动服务器
python manage.py runserver
#再启动worker
python manage.py celery worker -c 4 --loglevel=info
四、补充
Django下要查看其他celery的命令,包括参数配置、启动多worker进程的方式都可以通过python manage.py celery --help来查看:
另外,Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现,如下图所示:
Django下实现的方式如下:
1. 安装flower:
2. 启动flower(默认会启动一个webserver,端口为5555):
python manage.py celery flower
3. 进入http://localhost:5555即可查看。
http://www.cnblogs.com/znicy/p/5626040.html
分享到:
相关推荐
在同事的指引下接触了Celery这个异步任务队列框架,鉴于网上关于Celery和Django结合的文档较少,大部分也只是粗粗介绍了大概的流程,在实践过程中还是遇到了不少坑,希望记录下来帮助有需要的朋友。 一、Django中的...
Django Celery异步任务队列的实现是一个关键的技术,特别是在构建高性能的Web应用程序时,它可以帮助处理那些耗时的任务,提高用户体验。异步任务队列允许将长时间运行的操作从主线程分离出来,使得Web服务器可以...
- 在 `apps` 应用中定义异步任务函数,并使用 Celery 实例进行装饰: ```python from celery import Celery app = Celery('tasks', broker='redis://192.168.217.77:16379/8') @app.task def add(x, y): ...
在Django中集成Celery,我们可以实现高效、可扩展的异步任务处理。 首先,为了安装Celery,我们需要在项目环境中运行以下命令: ```bash pip install django-celery pip install celery ``` 接下来,我们需要在...
定义好任务之后,可以使用Celery提供的命令行工具来运行Celery实例,并通过Django的命令行工具调用任务,或者在Python的交互模式中测试任务是否能够被正确执行。 Celery提供了多种方法来调用任务,其中最常用的是...
在`email_service`的`tasks.py`文件中定义一个名为`send_email`的任务,这个任务应该包含实际的邮件发送逻辑,使用Python的`smtplib`或Django内置的`send_mail`函数。因为是异步任务,所以邮件的发送不会立即完成,...
通过以上步骤,我们就成功地在Django中使用Celery实现了异步信号处理。当用户注册并创建新用户对象时,`handle_user_saved`信号处理器会被触发,并异步调用`send_verification_email`任务,发送验证邮件。这大大提高...
本项目“基于Django+Celery队列实现的集中化异步任务调度系统”旨在提供一个易于集成的框架,帮助开发者快速在Django项目中实现异步任务处理,降低业务代码的复杂性。 Django是Python领域广泛使用的Web框架,以其...
这个项目结合了Django Web框架、Celery异步任务队列以及Amazon Simple Email Service (SES)。下面我们将深入探讨这些组件及其在邮件服务中的应用。 1. Django框架: Django是Python中最流行的Web开发框架之一,它...
【标题】"django_celery_demo" 是一个基于 Django 和 Celery 框架的示例项目,旨在帮助开发者理解如何在 Django 中集成并使用 Celery 进行异步任务处理。Django 是一个广受欢迎的 Python Web 开发框架,而 Celery 是...
本文将详细介绍如何在Django项目中集成Celery以实现异步任务处理。 Celery是一个分布式任务队列,它专注于实时任务处理,并提供任务调度功能。它的核心特性包括快速、简单、高可用和灵活。Celery的工作机制是通过...
4. 在Django中集成Celery,创建异步任务,并在视图函数中调用这些任务。 5. 学习如何使用Redis作为结果后端,存储和查询任务结果。 6. 安装并配置Supervisor,创建配置文件来管理Celery worker进程。 7. 测试整个...
【django-celery】是一个基于Python的开源框架,它将流行的Web框架Django与任务队列Celery相结合,用于处理异步任务和分布式工作负载。Celery的核心是其任务队列系统,它允许开发者在不阻塞主线程的情况下执行耗时...
在Django中,为了提升应用程序的性能和用户体验,常常需要将一些耗时的操作,比如邮件发送、数据分析等,从主线程中分离出来,通过异步任务来处理。Celery是一个强大的分布式任务队列,它专注于实时操作,但也支持...
在Python开发中,Django框架常用于构建Web应用程序,而Celery则是一个分布式任务队列,用于处理异步任务和后台作业。当项目规模扩大,涉及到大量的异步任务处理时,对Celery任务和worker的监控就显得尤为重要。...
总结来说,Django 中使用 Celery 实现分布式任务队列的关键步骤包括安装依赖、配置 Django 项目、编写任务函数、迁移数据库、启动 worker,以及在视图中调用异步任务。这种方法可以帮助你在不牺牲用户体验的情况下...
现在,让我们深入探讨如何在Django中集成Celery和Redis: 1. **安装依赖**:首先,你需要在你的虚拟环境中安装`celery`和`redis`库。可以使用`pip install celery redis`命令进行安装。 2. **配置Celery**:在你的...
在实际项目中,Celery还可以与其他工具如Flask、Django等Web框架集成,实现更复杂的异步任务处理和调度功能。 在提供的压缩包文件"Celery框架构建一部任务服务程序"中,可能包含了完整的示例代码、配置文件以及运行...