Celery异步任务队列/周期任务+ RabbitMQ + Django

1、Celery介绍和基本使用 

Celery 是一个 基于python开发的分布式异步消息任务队列,经过它能够轻松的实现任务的异步处理, 若是你的业务场景中须要用到异步任务,就能够考虑使用celery, 举几个实例场景中可用的例子:python

  1. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只须要拿着这个任务id就能够拿到任务执行结果, 在任务执行ing进行时,你能够继续作其它的事情。 
  2. 你想作一个定时任务,好比天天检测一下大家全部客户的资料,若是发现今天 是客户的生日,就给他发个短信祝福

 

Celery 在执行任务时须要经过一个消息中间件来接收和发送任务消息,以及存储任务结果, 通常使用rabbitMQ or Redis,后面会讲web

Celery有如下优势:redis

  1. 简单:一单熟悉了celery的工做流程后,配置和使用仍是比较简单的
  2. 高可用:当任务执行失败或执行过程当中发生链接中断,celery 会自动尝试从新执行任务
  3. 快速:一个单进程的celery每分钟可处理上百万个任务
  4. 灵活: 几乎celery的各个组件均可以被扩展及自定制

 

2、Django-Celery安装

pip install django-celery  django

#注:安装django-celery会自动安装依赖版本的celerysession

 

3、Django settings设置celery

pip install django-celery  app

import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://172.17.0.8:5672'
RESULT_BACKEND = 'amqp://172.17.0.8:5672'
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djcelery',    #app这里要增长djcelery
)
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

注:这里Celery broker我用的RabbitMQ ,也能够用redis异步

 

4、建立django-celery所须要的表

python manage.py migrateasync

 

5、在django app根目录中建立tasks.py

python manage.py migrate分布式

from celery import task
@task
def add(x, y):
    return x + y

 

6、View中调用定义的task

from django.shortcuts import render,HttpResponse
from web import tasks

def show(request):
res = tasks.add.delay(3,3)
print("start running task")
print("async task res",res.get() )
return HttpResponse('结果: %s'%res.get())

  

7、启动worker并调用VIEW测试

python manage.py celery worker --loglevel=info

 

8、Celery定时周期任务

一、django admin中配置crontab测试

 

二、添加一个每分钟执行一次的crontab

 

三、添加周期任务,并把task和crontab关联

 

四、启动worker 和 beat测试计划任务

python manage.py celery worker --loglevel=info

python manage.py celery beat --loglevel=info

 

已看到任务在后台每分钟执行一次该任务。

相关文章
相关标签/搜索