• Django 使用 Celery 实现异步任务


    对于网站来说,给用户一个较好的体验是很重要的事情,其中最重要的指标就是网站的浏览速度。因此服务端要从各个方面对网站性能进行优化,比如可采用CDN加载一些公共静态文件,如js和css;合并css或者js从而减少静态文件的请求等等…..还有一种方法是将一些不需要立即返回给用户,可以异步执行的任务交给后台处理,以防网络阻塞,减小响应时间。看了the5fire的博客之后我受到了启发,决定从这方面进行改进。

    我采用celery实现后台异步执行的需求。对于celery,先看一下网上给的celery的定义和用途:

    上面的英文还是比较好理解的,简而言之,就是一个专注于实时处理和任务调度的分布式队列。

    我买了一本《Python Web开发实战》,那里面也介绍了celery。说了使用celery的常见场景:

    1. Web应用。当用户触发一个动作需要较长时间来执行完成时,可以把它作为任务交给celery异步执行,执行完再返回给用户。这点和你在前端使用ajax实现异步加载有异曲同工之妙。
    2. 定时任务。假设有多台服务器,多个任务,定时任务的管理是很困难的,你要在不同电脑上写不同的crontab,而且还不好管理。Celery可以帮助我们快速在不同的机器设定不同任务。
    3. 其他可以异步执行的任务。比如发送短信,邮件,推送消息,清理/设置缓存等。这点还是比较有用的。

    综上所述,第1点和第3点的用途是我考虑celery的原因。目前,考虑在Django中实现两个功能:

    1. 文章阅读量的统计
    2. 发送邮件

    关于文章阅读量的统计,我之前的做法就是在用户每一次访问文章的时候,都会同步执行一遍+1的函数,现在打算用异步执行的方式。

    下面介绍在Django中的使用方法:

    1、环境准备

    安装celery,rabbitmq,django-celery.

    2、启动消息中间件rabbitmq。
    用它的原因是celery官方推荐的就是它,也可以用Redis等,但Redis会因为断电的原因造成数据全部丢失等问题。

    让其在后台运行:

    3、在Django中配置(源代码)

    项目代码结构

    对于celery的配置,需要编写几个文件:

    1、dailyblog/celery.py

    本模块主要是创建了celery应用,配置来自django的settings文件。

    关于config_from_object,我对于如何加载配置文件还是比较感兴趣的,于是研究了一下源码,具体可以见:“celery加载配置文件”

    2、settings.py

    配置celery,

    setup_loader目的是设定celery的加载器,源码:

    3、dailyblog/init.py

    4、blog/tasks.py

    这里面添加了一个任务。任务可以通过delay方法执行,也可以周期性地执行。

    这里还需要注意,如果把上面任务的返回值赋值给一个变量,那么程序也会被阻塞,需要等待异步任务返回的结果。因此,实际应用不需要赋值。

    上面的代码写好后,要执行数据库更新:厦门租叉车

    Django会创建了几个数据库,分别为:

    Crontabs Intervals Periodic tasks Tasks Workers

    在views.py添加异步任务:

    这里不需要赋值。

    下面要启动celery,我采用supervisor进程管理器来管理celery:

    重新加载supervisor.conf文件,然后启动celery:

    至此,通过celery异步执行任务的程序写完了。除此之外,还可以写很多的异步任务,发邮件就是非常典型的一种。

  • 相关阅读:
    左偏树——可以标记合并的堆
    主席树——多棵线段树的集合
    [中山市选2011]完全平方数 ——莫比乌斯函数
    决策单调性优化dp
    [NOI2015]寿司晚宴——状压dp
    【[国家集训队]等差子序列】
    线性基——数集压缩自动机
    Java实现 蓝桥杯VIP 算法训练 筛选号码
    BSGS&EXBSGS 大手拉小手,大步小步走
    CRT&EXCRT 中国剩余定理及其扩展
  • 原文地址:https://www.cnblogs.com/xyou/p/8031253.html
Copyright © 2020-2023  润新知