Rabbitmq 和 Celery 是怎样什么工作好的

单说Python web框架我们知道django和flask这些应用比較多的框架都是同步框架
同步指页面无法进行异步加载,通俗一点就是你的业务逻辑只能在该页面进行当任务没有执行完的时候,你跳转页面或者别的操作后导致你的任务没有完全处理完成,导致整个业务有很大的漏洞
在用户体验方面也是不好的,异步处理目的是高度解耦使一些时间过长,任务过多的操作保存起来交给后台慢慢处理,保证了用户的基本操作不会受到影响也提高了后台服务器處理的压力,
我们这里就使用celery定时或者异步处理rabbitmq作为broker,保证程序的完美运行

1 编译安装方式 安装erlang语言环境(rabbitmq需要的特定环境)

2 erlang语言环境嘚安装(rabbitMq是用erlang分布式语言开发的,下载版本可能略有不同)

我安装过程中出现java环境编译失败但是我生产过程中没有使用java环境,所以直接略过問题make install 安装了,也是参考博客安装的后来成功啦!

erlang语言编译配置选项:

会输出 erlang安装版本号

3.4查看状态,如果显示如下截图说明安装成功:

首先创建目录否则可能报错:

现在你在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理页面了,是不是很兴奋可是你没有账号密码,别急

3.7配置訪问账号密码和权限:
默认网页是不允许访问的,需要增加一个用户修改一下权限代码如下:

然后就可以远程访问了,然后可直接配置鼡户权限等信息

注意tasks.py必须建在各app的根目录下,不能随意命名

使用函数名.delay()即可使函数异步执行
可以通过result.ready()来判断任务是否完成处理
如果任務抛出一个异常,使用result.traceback可以获取原始的回溯信息

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

Celery 定时任务配置,异步任务和计划任务同時开启

}

之前在分布式消息队列上我一直使用rabbitmq+pika组合然而由于对rabbitmq与pika理解不深,因此使用过程中遇到了很多坑直到最近我决定重新研究下分布式消息队列,当然这次抛弃了pika而选鼡celery。

  回想之前我对pika与celery有过一些疑问两者有何区别?又有何相同点经过几天的研究,目前总算是清晰了一点因此在此对celery+rabbitmq做个记录。

说明:celery只支持python2.7及以上版本建议在虚拟环境中安装,如何构造虚拟环境可参考:

Celery是如何什么工作好的

我在此模拟几个角色来解释下celery+rabbitmq是洳何什么工作好的,脑洞来自网络这里借鉴扩展一番。

假设目前D公司要开半年度什么工作好会议会议上要指定下半年什么工作好计划,参会人员有老板(下发任务者)、部门主管(celery分配任务者)、部门员工(什么工作好者)、老板秘书(沟通协调者rabbitmq)。

  那么这场會议首先需要确定的是下半年的具体什么工作好内容这里就称之为“任务内容”。比如老板说我们下半年要开发出一个大数据平台部門主管举手称赞,表示赞同于是便愉快地定下了我们具体的什么工作好任务(task),当然开发一个平台算是这个项目的总任务其中可以細分成很多小的任务,比如大数据算法怎么写界面怎么设计等。

  在确定了具体什么工作好任务后老板便把这个项目交给了部门主管(celery),而部门主管此时要确定谁去完成这项任务它可以指定某个人(worker),也可以多个人

  毫无疑问发布什么工作好任务的人是老板(下发任务者),他指定了部门主管(celery)什么时候去完成哪些任务并要求获取反馈信息。但有一点需要注意老板只管布置任务,但鈈参与具体的任务分配那这个任务分配的功能交给谁,没错就是部门主管即celery。

老板与员工如何沟通项目

  项目之初,老板通过电話将任务传递给部门主管部门主管通过部门会议将任务分配给员工,过段时间再将任务结果反馈给老板然而随着任务越来越多,部门主管就发现了一个问题任务太多了,每个任务还要反馈结果记不住,也容易弄乱导致效率下降。
  在召开会议商量了一番后老板秘书站起来说:“我有个提议,老板每天将布置的任务写成一张纸条放到我这然后部门主管每天早上来取并交给员工,至于纸条上的任务如何分配部门主管决定就行,但是要将结果同样写一张纸条反馈给我我再交给老板。这样老板只负责下发任务我只负责保管任務纸条,部门主管只负责分配任务并获取反馈员工只负责按任务什么工作好。大家职责都很明确效率肯定会更高。”至此老板与员笁的沟通问题也解决了。

说明:celery_con.py的作用是连接rabbitmq注意这里是利用celery连接的rabbitmq。映射到场景中就是秘书与主管,秘书与老板之间传递信息的通噵

说明:task.py的功能是定制具体的任务,即“任务内容”映射到场景中便是“开发一个大数据平台”,其中算法要怎么写界面要如何设計等等。

说明:此命令为开启work分配任务;task就是task.py脚本的名称,表示work为task任务服务;-c 2表示同时开启2个work映射到场景中,便是部门主管实时向秘書获取纸条并分配给员工。

说明:run.py的作用是下发消息到rabbitmq队列中映射到场景中即老板将任务写在纸条上交给秘书。

而这里的秘书指的就昰rabbitmq

  简单来说,pika其实就是用来连接rabbitmq服务的一个python客户端模块而rabbitmq本身只有消息存储功能,并没有任务的分配调度当然在用pika连接rabbitmq的过程吔可以任务分配,这需要利用pika模块自己写一个调度代码也就是相当于自己写一个celery模块。
  celery就是用来分配任务的主要是做异步任务队列的,但是celery不具备存储的功能因此需要一种介质去存储消息,所以常常与rabbitmq一起用

并发的下发任务,也可以使用for循环这里指的并发,並不是所有任务一起执行而是所有任务都下发到队列,而执行的并发数量取决于work的数量。

有时候我们会遇到多个任务而每个任务的執行对象不一样,因此需要创建不同的队列去存储任务这时就需要我们在创建任务、消费任务时指定队列的名称。

说明:下发任务时將会把任务存入rabbitmq的test1队列中。

更多celery的用法可以参考:

以上内容是个人理解的celery用法以及一些原理,如有谬误欢迎指正,谢谢!

}

我要回帖

更多关于 什么工作 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信