首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python分布式进程

说明:本文是基于Py2.X环境,

分布式进程:

分布式进程是指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

举个例子:做爬虫程序时,常常会遇到这样的场景,我们想抓取图片的链接地址,将链接地址存放到Queue中,另外的进程负责从Queue中读取链接地址进行下载和存储到本地。现在把这个过程做成分布式,一台机器上的进程负责抓取链接,其它机器上的进程负责下载存储,那么遇到的主要问题是将Queue暴露到网络中,让其它机器进程都可以访问,分布式进程就是将这一个过程进行了封装,我们可以将这个过程称为本队列的网络化。

创建分布式进程需要一个服务进程与任务进程:

服务进程创建:

建立队列Queue,用来进行进程间的通信。服务进程创建任务队列taskqueue,用来作为 传递任务给任务进程的通道;服务进程创建结果队列resultqueue,作为任务进程完成任务后回复服务进程的通道。在分布式多进程环境下,必须通过由Queuemanager获得Queue接口来添加任务.

把第一步中建立的队列在网络上注册,暴露给其它进程(主机),注册后获得网络队列,相当于本队队列的映像.

建立一个险象(Queuemanager(BaseManager))实例manager,绑定端口和验证口令。

启动第三步中建立的实例,即启动管理manager,监管信息通道

通过管理实例的方法获得通过网络访问的Queue对象,即再把网络队列实体化成可以使用的本地队列.

创建任务到"本地"队列中,自动上传任务到网络队列中,分配给任务进程进行处理。

注意:我这里是基于window操作系统的,linux系统会有所不同

任务进程创建

使用QueueManager 注册用于获取Queue的方法名称,任务进程只能通过名称来在网络上获取Queue

连接服务器中,端口和验证口令注意保持与服务进程中完全一致

从网络上获取Queue,进行本地化

从Task队列获取任务,并把结果result队列

执行结果

先运行:服务进程得到结果

再立即运行:任务进程得到结果,防止进程走完后得不到结果,这里一定要立即执行

最后再回头看服务进程窗口的结果

这就是一个简单但真正的分布式计算,把代码稍加改造,启动多个worker,就把任务分布到几台甚至几十台机器上,实现大规模的分布式爬虫

Python绿色通道∣你的Python之旅

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171221G00V5M00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券