原生celery,非djcelery模块,所有演示均基于Django2.0

celery是一个基于python开发的简单、灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度。采用典型的生产者-消费者模型,主要由三部分组成:

  1. 消息队列broker:broker实际上就是一个MQ队列服务,可以使用redis、rabbitmq等作为broker
  2. 处理任务的消费者workers:broker通知worker队列中有任务,worker去队列中取出任务执行,每一个worker就是一个进程
  3. 存储结果的backend:执行结果存储在backend,默认也会存储在broker使用的MQ队列服务中,也可以单独配置用何种服务做backend

异步任务

我的异步使用场景为项目上线:前端web上有个上线按钮,点击按钮后发请求给后端,后端执行上线过程要5分钟,后端在接收到请求后把任务放入队列异步执行,同时马上返回给前端一个任务执行中的结果。若果没有异步执行会怎么样呢?同步的情况就是执行过程中前端一直在等后端返回结果,页面转呀转的就转超时了。

异步任务配置

1.安装rabbitmq,这里我们使用rabbitmq作为broker,安装完成后默认启动了,也不需要其他任何配置

# apt-get install rabbitmq-server
复制代码

2.安装celery

# pip3 install celery
复制代码

3.celery用在django项目中,django项目目录结构(简化)如下

website/
|-- deploy
|   |-- admin.py
|   |-- apps.py
|   |-- __init__.py
|   |-- models.py
|   |-- tasks.py
|   |-- tests.py
|   |-- urls.py
|   `-- views.py
|-- manage.py
|-- README
`-- website|-- celery.py|-- __init__.py|-- settings.py|-- urls.py`-- wsgi.py复制代码

4.创建website/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', 'website.settings')app = Celery('website')# 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()# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True@app.task(bind=True)
def debug_task(self):print('Request: {0!r}'.format(self.request))
复制代码

5.在website/__init__.py文件中增加如下内容,确保django启动的时候这个app能够被加载到

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__all__ = ['celery_app']
复制代码

6.各应用创建tasks.py文件,这里为deploy/tasks.py

from __future__ import absolute_import
from celery import shared_task@shared_task
def add(x, y):return x + y
复制代码
  • 注意tasks.py必须建在各app的根目录下,且只能叫tasks.py,不能随意命名

7.views.py中引用使用这个tasks异步处理

from deploy.tasks import adddef post(request):result = add.delay(2, 3)
复制代码
  • 使用函数名.delay()即可使函数异步执行
  • 可以通过result.ready()来判断任务是否完成处理
  • 如果任务抛出一个异常,使用result.get(timeout=1)可以重新抛出异常
  • 如果任务抛出一个异常,使用result.traceback可以获取原始的回溯信息

8.启动celery

# celery -A website worker -l info
复制代码

9.这样在调用post这个方法时,里边的add就可以异步处理了

定时任务

定时任务的使用场景就很普遍了,比如我需要定时发送报告给老板~

定时任务配置

1.website/celery.py文件添加如下配置以支持定时任务crontab

from celery.schedules import crontabapp.conf.update(CELERYBEAT_SCHEDULE = {'sum-task': {'task': 'deploy.tasks.add','schedule':  timedelta(seconds=20),'args': (5, 6)}'send-report': {'task': 'deploy.tasks.report','schedule': crontab(hour=4, minute=30, day_of_week=1),}}
)
复制代码
  • 定义了两个task:

    • 名字为'sum-task'的task,每20秒执行一次add函数,并传了两个参数5和6
    • 名字为'send-report'的task,每周一早上4:30执行report函数
  • timedelta是datetime中的一个对象,需要from datetime import timedelta引入,有如下几个参数

    • days:天
    • seconds:秒
    • microseconds:微妙
    • milliseconds:毫秒
    • minutes:分
    • hours:小时
  • crontab的参数有:

    • month_of_year:月份
    • day_of_month:日期
    • day_of_week:周
    • hour:小时
    • minute:分钟

2.deploy/tasks.py文件添加report方法:

@shared_task
def report():return 5
复制代码

3.启动celery beat,celery启动了一个beat进程一直在不断的判断是否有任务需要执行

# celery -A website beat -l info
复制代码

Tips

1.如果你同时使用了异步任务和计划任务,有一种更简单的启动方式celery -A website worker -b -l info,可同时启动worker和beat 2.如果使用的不是rabbitmq做队列那么需要在主配置文件中website/celery.py配置broker和backend,如下:

# redis做MQ配置
app = Celery('website', backend='redis', broker='redis://localhost')
# rabbitmq做MQ配置
app = Celery('website', backend='amqp', broker='amqp://admin:admin@localhost')
复制代码

3.celery不能用root用户启动的话需要在主配置文件中添加platforms.C_FORCE_ROOT = True 4.celery在长时间运行后可能出现内存泄漏,需要添加配置CELERYD_MAX_TASKS_PER_CHILD = 10,表示每个worker执行了多少个任务就死掉

参考文章:

  • docs.celeryproject.org/en/latest/
  • github.com/pylixm/cele…
  • pylixm.cc/posts/2015-…

Django配置celery执行异步任务和定时任务相关推荐

  1. Django+redis+celery实现异步任务

    1 Django中的异步请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 -- http handling(request解析) -- u ...

  2. Celery 之异步任务、定时任务、周期任务

    什么是Celery? Celery 是芹菜 Celery 是基于Python实现的模块, 用于执行异步定时周期任务的 其结构的组成是由     1.用户任务 app     2.管道 broker 用 ...

  3. Django配置MySQL执行python manage.py makemigrations 出现No changes detected报错

    在给Django配置mysql的时候按照教程在Model.py文件中配置加入定义模型类的代码后 执行数据迁移代码 python manage.py makemigrations 报错 显示No cha ...

  4. django配置随时执行的脚本,使用运行时的manage环境执行程序

    有时候需要在启动django后执行一些数据的实时采集或更新操作,这篇博客记录脚本的配置与运行 安装依赖 首先安装依赖: pip install django-extensions 然后在setting ...

  5. django 集成个推_Django动态添加定时任务之djangocelery的使用

    定时任务和周期任务在我们日常工作中应用广泛,例如定时发布.周期巡检等,通常我们会借助Linux下的Crontab来实现,但如何将这一功能搬进我们自研的运维系统呢?借助django-celery即可轻松 ...

  6. Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务

    1前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就 ...

  7. Django blog项目《二十五》:项目优化《1》使用celery异步任务和定时任务

    celery异步异步任务处理 一.celery简介 celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html 组件 任务Tas ...

  8. Django通过celery 异步发送邮件 : django开发之天天生鲜项目知识总结【5】

    这里初次学习celery,只简单讲解一下如何使用celery 异步发送邮件,在以后的总结中还会,多次提到celery,因为后面很多任务都需要用到celery执行任务,后面再专门针对celery做具体的 ...

  9. Django中celery配置总结

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

最新文章

  1. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
  2. CKfinder2.0.2版本破解
  3. Redisson实现Redis分布式锁的N种姿势
  4. 【Deep Learning笔记】前馈神经网络和BP算法
  5. html建站软件,站长建站更简易 十款最佳Windows免费网页编辑器
  6. python3-datetime 时间处理
  7. tomcat报404
  8. c语言作业ce是什么错误代码,[求助]C语言实现ce搜索功能的两道题
  9. ElasticSearch核心基础之入门篇
  10. HR_Hash Tables: Ransom Note
  11. Struts2-02-OGNL及值栈
  12. Latest node.js npm installation on Ubuntu 12.04
  13. 实验第七节——用户chaincode相关操作
  14. 如何将Python程序打包成linux可执行文件
  15. Ext3.4.0中EditorGridPanel可以复制文本
  16. html闹钟设置,闹钟设置页.html
  17. 计算机英语这门课上后感1000,英语公开课观后感作文1000字
  18. OrCAD DSN文件无故消失解决办法
  19. html 图像热点在线处理,html area图片热点的使用介绍附相关属性一览表
  20. 生物识别技术在汽车领域带来了巨大变革

热门文章

  1. 奇点云发布三大无人零售终端产品,“云”“端”结合赋能零售商
  2. Google工作10年,关于技术、管理和职场生涯的一些感悟
  3. 加强版Redis,又一款国产高性能KV存储数据库开源了!
  4. Docker怎么修改hosts
  5. 浪漫的形式有100种,单身的就1种!
  6. 数据项目总结:王者荣耀总决赛预测!
  7. 数据分析之Pandas分组操作总结
  8. 00后电竞女学霸直博中科院,本科武大王者全国16强,网友:现实版爽文女主角...
  9. 登顶CLUE榜单,腾讯云小微与腾讯AI Lab联合团队提出基于知识的中文预训练模型...
  10. 火爆 GitHub!这个图像分割神器究竟有什么魅力?