zoukankan      html  css  js  c++  java
  • celery

    celery

    一、celery介绍

    1、应用场景

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

        b. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情

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

    2、redis的优点

        a. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的

        b. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务

        c. 快速:一个单进程的celery每分钟可处理上百万个任务

        d. 灵活: 几乎celery的各个组件都可以被扩展及自定制

    3. celery的工作流程

     

       user:用户程序,用于告知celery去执行一个任务。      broker: 存放任务(依赖RabbitMQ或Redis,进行存储)      worker:执行任务

    4、celery的特性

          1)方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.

          2)可选 多进程, Eventlet 和 Gevent 三种模型并发执行.

          3)Celery 是语言无关的.它提供了python 等常见语言的接口支持.

    二、异步任务 ---- django-celery

     

    大家的知道celery的使用,网上也有很多的教程。因为最近在使用django来完成项目,无意间发现发现有个东西叫django-celery,比celery的配置更加的简单,这里分享一下。

    首先需要统一一下使用的环境,以为如果redis的版本过高会报错

    img

     

    推荐版本  

      Django == 2.2.6

      django-celery == 3.3.1

      django-redis == 4.11.0

      redis == 2.10.6

      celery == 3.1.26.post2

     

    配置settings.py

      因为本机直接有redis,在这里我们直接使用redis作为我们的broker。当然,如果你追求稳定性和效率,也可使使用rabbitMQ或者kafka。  

    #settings.pyimport djcelery
    ​
    djcelery.setup_loader()
    BROKER_URL = 'redis://127.0.0.1:6379/2'
    ​
    INSTALLED_APPS = [
        ...
        "djcelery",
        ...
    ​
    ]
    setting.py

      创建Celery所需的数据表

    python manage.py migrate
    #如若不成功可以尝试一下命令语句
    #python manage.py syncdb
    终端

    创建task

      在app里建立tasks.py文件来写入需要执行的异步任务

    img

     

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

      a、当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为task的function, 并将它们注册为celery task.

      b、在执行djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注册的

      c、一次需要注意 在impprt task时, 需要保持一致

      d、如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug。

     

    让任务变成异步

      例如我们希望在用户发出request后异步执行该task, 马上返回response, 从而不阻塞该request, 使用户有一个流畅的访问过程. 那么, 我们可以使用.delay。

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from userapp.tasks import add
    
    class TestCeleryView(APIView):
        def get(self,request):
    
            data = add.delay(2,10)  #delay是注册为celery异步任务的关键点
    
            return Response({"code":200})
    view.py

     

    启动celery

      首先正常启动你的django任务,然后启动celery服务即可。

    python manage.py celery worker --loglevel=info

     如果报错不让超级管理员来启动,在settings.py加入以下配置

    from celery import Celery, platforms
    platforms.C_FORCE_ROOT = True

     

    验证celery任务

      在搞定上面的东西以后,你就可以通过postman来请求接口让接口使用celery来异步执行任务而不阻塞你的request请求。

    img

     

     

    注意

    celery与3.7版本兼容问题 在 celery 官方的提议下,建议将 async 文件的文件名改成 asynchronous

    Python37Libsite-packageskombuasync

    需要修改的文件 Python37Libsite-packagesceleryutils imer2.py

    Python37libsite-packagesceleryconcurrencyasynpool.py

    Python37libsite-packagesceleryworkercomponents.py

    Python37libsite-packagesceleryworkerautoscale.py

    Python37libsite-packagesceleryworkerconsumer.py

  • 相关阅读:
    命令式语言和声明式语言对比——JavaScript实现快速排序为例
    merge sort 的javascript实现
    快速排序算法的简短描述
    Hadoop 2.x 版本的单机模式安装
    数据分析招聘网招聘信息分析报告
    使用PROC TRANSPOSE过程步对数据集进行转置时如何保持日期变量的时间顺序
    饼图微创意
    我的微博关键字
    QQ群成员发言次数统计(词云制作)
    在SAS数据步中执行过程步的简单示例
  • 原文地址:https://www.cnblogs.com/my-soul-my-heart/p/13929769.html
Copyright © 2011-2022 走看看