说明:本文是基于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之旅
领取专属 10元无门槛券
私享最新 技术干货