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


    一、Celery介绍和基本使用 

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

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

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

    Celery有以下优点:

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

     

    二、Django-Celery安装

    pip install django-celery  

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

    三、Django settings设置celery

    pip install django-celery  

    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

    四、创建django-celery所需要的表

    python manage.py migrate

    五、在django app根目录中创建tasks.py

    python manage.py migrate

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

    六、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())

      

    七、启动worker并调用VIEW测试

    python manage.py celery worker --loglevel=info

    八、Celery定时周期任务

    1、django admin中配置crontab

     

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

     

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

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

    python manage.py celery worker --loglevel=info

    python manage.py celery beat --loglevel=info

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

  • 相关阅读:
    【css】rem及其替换方案
    【css】如何实现环形进度条
    【js】我们需要无限滚动列表吗?
    【js】再谈移动端的模态框实现
    【js】callback时代的变更
    【js】为什么要使用react+redux
    【js】JavaScript parser实现浅析
    【css】回想下经典的布局
    【JS】温故知新: 从parseInt开始
    【渲染原理】浏览器渲染原理的个人整理
  • 原文地址:https://www.cnblogs.com/yangmv/p/6623343.html
Copyright © 2020-2023  润新知