python 分布式_python分布式进程

本文详细介绍了如何使用Python的multiprocessing模块创建分布式进程,特别是通过managers子模块实现进程间通信。在分布式多进程环境下,通过QueueManager注册并暴露Queue对象,使得不同机器上的进程能通过网络进行任务分配和结果返回。文章提供了一个爬虫程序的例子,展示了一个服务进程负责抓取图片链接,其他进程负责下载和存储图片的流程。
摘要由CSDN通过智能技术生成

分布式进程指的是将Process进程分布到多台机器上,充分利用多态机器的性能完成复杂的任务

分布式进程在python 中依然要用到multiprocessing 模块。multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。可以写一个服务进程作为调度者,将任务分布到其他多

个进程中,依靠网络通信进行管理。例子:在做爬虫程序时,抓取某个网站的所有图片,如果使用多进程的话,一般是一个进程负责抓取图片的链接地址,将链接地址放到queue中,另外的进程负责从queue中取链接地址进行下载和存储到本地。现在把这个过程做成分布式,一台机器上的进程负责抓取链接地址,其他机器上的进程负责系在存储。那么遇到的主要问题是将queue 暴露到网络中,让其他机器进程都可以访问,分布式进程就是将这个过程进行了封装,我们可以将这个过程称为本地队列的网络化

1252747-20180801110458587-658682427.png

要实现上面例子的功能,创建分布式进程需要分为 六个步骤

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

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

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

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

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

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

接下来通过程序实现上面的列子(window版),首先编写的是服务进程(taskManager.py)

#!coding:utf-8

from multiprocessing.managers import BaseManager

from multiprocessing import freeze_support, Queue

# 任务个数

task_number = 10

# 收发队列

task_quue = Queue(task_number)

result_queue = Queue(task_number)

def get_task():

return task_quue

def get_result():

return result_queue

# 创建类似的queueManager

class QueueManager(BaseManager):

pass

def win_run():

# 注册在网络上,callable 关联了Queue 对象

# 将Queue对象在网络中暴露

#window下绑定调用接口不能直接使用lambda,所以只能先定义函数再绑定

QueueManager.register('get_task_queue', callable=get_task)

QueueManager.register('get_result_queue', callable=get_result)

# 绑定端口和设置验证口令

manager = QueueManager(address=('127.0.0.1', 8001), authkey='qiye'.encode())

# 启动管理,监听信息通道

manager.start()

try:

# 通过网络获取任务队列和结果队列

task = manager.get_task_queue()

result = manager.get_result_queue()

# 添加任务

for url in ["ImageUrl_" + str(i) for i in range(10)]:

print('url is %s' % url)

task.put(url)

print('try get result')

for i in range(10):

print('result is %s' % result.get(timeout=10))

except:

print 'Manager error'

finally:

manager.shutdown()

if __name__ == '__main__':

# window下多进程可能有问题,添加这句话缓解

freeze_support()

win_run()

服务进程已经编写好,接下来任务进程(taskWorker.py)创建四步骤:

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

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

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

从task队列获取任务,并且把结果写入result队列

#coding:utf-8

import time

from multiprocessing.managers import BaseManager

# 创建类似的QueueManager:

class QueueManager(BaseManager):

pass

# 实现第一步:使用QueueManager注册获取Queue的方法名称

QueueManager.register('get_task_queue')

QueueManager.register('get_result_queue')

# 实现第二步:连接到服务器:

server_addr = '127.0.0.1'

print('Connect to server %s...' % server_addr)

# 端口和验证口令注意保持与服务进程设置的完全一致:

m = QueueManager(address=(server_addr, 8001), authkey='qiye')

# 从网络连接:

m.connect()

# 实现第三步:获取Queue的对象:

task = m.get_task_queue()

result = m.get_result_queue()

# 实现第四步:从task队列取任务,并把结果写入result队列:

while(not task.empty()):

image_url = task.get(True,timeout=5)

print('run task download %s...' % image_url)

time.sleep(1)

result.put('%s--->success'%image_url)

# 处理结束:

print('worker exit.')

运行结果:

taskManager.py

C:\Python27\python.exe F:/python_scrapy/python_study/taskManager.py

url is ImageUrl_0

url is ImageUrl_1

url is ImageUrl_2

url is ImageUrl_3

url is ImageUrl_4

url is ImageUrl_5

url is ImageUrl_6

url is ImageUrl_7

url is ImageUrl_8

url is ImageUrl_9

try get result

result is ImageUrl_0--->success

result is ImageUrl_1--->success

result is ImageUrl_2--->success

result is ImageUrl_3--->success

result is ImageUrl_4--->success

result is ImageUrl_5--->success

result is ImageUrl_6--->success

result is ImageUrl_7--->success

result is ImageUrl_8--->success

result is ImageUrl_9--->success

Process finished with exit code 0

任务进程(taskWorker.py)

C:\Python27\python.exe F:/python_scrapy/python_study/taskWorker.py

Connect to server 127.0.0.1...

run task download ImageUrl_0...

run task download ImageUrl_1...

run task download ImageUrl_2...

run task download ImageUrl_3...

run task download ImageUrl_4...

run task download ImageUrl_5...

run task download ImageUrl_6...

run task download ImageUrl_7...

run task download ImageUrl_8...

run task download ImageUrl_9...

worker exit.

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值