python芹菜分布式任务队列的使用详解

  


  

  

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

  

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

  

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

  

<强> 1.1芹菜有以下优点:
  

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

芹菜基本工作流程图

  

 python芹菜分布式任务队列的使用详解

  

<强> 1.2芹菜安装使用
  

  

芹菜的默认代理是RabbitMQ,仅需配置一行就可以

        broker_url=' amqp://客人:guest@localhost: 5672//      

rabbitMQ没装的话请装一下

  

使用复述,做代理也可以

  

安装复述组件

  

pip安装- u“芹菜(复述)”
  

  

配置   

配置很简单,只是复述,数据库配置的位置:

        app.conf。broker_url=案词?//localhost: 6379/0”      

URL的格式:

        复述://:password@hostname:港口/db_number      

方案后所有字段是可选的,并将默认为localhost>   app.conf。result_backend=案词?//localhost: 6379/0”      

<强> 1。3开始使用芹菜啦
  

  

安装芹菜模块
  

        pip安装芹菜      

创建一个应用程序用芹菜来定义你的任务列表

  

创建一个任务文件就叫tasks.py吧

        从芹菜进口芹菜      应用=芹菜(“任务”,   代理=复述://localhost,   后端=复述://localhost)      @app.task   def添加(x, y):   print(“运行…”,x, y)   返回x + y      

启动芹菜工人来开始监听并执行任务

        芹菜——任务的工人——loglevel=info      

调用任务

  

再打开一个终端,进行命令行模式,调用任务

        从任务导入添加   add.delay (4, 4) #      

看你的工人终端会显示收到一个任务,此时你想看任务结果的话,需要在调用任务时赋值个变量

        结果=add.delay (4, 4)      

准备()方法返回是否已经完成处理任务:

        在在在result.ready ()   假   ,,,,,,,,
     

你可以等待结果完成,但是这是很少使用,因为它将异步调用变成同步>   在在在result.get(超时=1)   8   <代码>
     

任务提出了一个异常,得到()将re-raise例外,但是你可以通过指定传播覆盖这个论点:

        在在在result.get(传播=False)   ,,<代码>
     

如果任务提出了一个异常也可以访问原始回溯:

        在在在result.traceback   …   ,,,,,,   


  

  

可以把芹菜配置成一个应用

  

目录格式如下

        1项目/__init__ . py   2/celery.py   3/tasks.py      

<强>项目/芹菜。py内容
  

        从进口absolute_import __future__ unicode_literals   从芹菜进口芹菜      应用=芹菜(“项目”,   代理=' amqp://',   后端=' amqp://',   包括=[' proj.tasks '])      #可选配置,请参阅用户指南的应用程序。   app.conf.update (   result_expires=3600,   )      if __name__==癬_main__”:   app.start ()

python芹菜分布式任务队列的使用详解