分布式进程

分布式进程是指把进程分布到多台机器上,在爬虫开发中可以应用到分布式爬虫。

multiprocessing模块的managers子模块支持把进程分布到多台机器上。做法是写一个服务进程作为调度者,将任务分布到其他进程中,由其他机器进行处理,依靠网络通信进行管理。

创建分布式进程的步骤

服务进程需要六个步骤:

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

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

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

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

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

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

例子1:服务进程(taskManager.py)

# coding=utf8import queuefrom multiprocessing.managers import BaseManagerfrom multiprocessing import freeze_support# 任务总数10个task_number = 10# 存放任务的队列task_queue = queue.Queue(task_number)# 存放结果的队列result_queue = queue.Queue(task_number)

def get_task():
   
return task_queue

def get_result():
   
return result_queue

class QueueManager(BaseManager):
   
pass
# 把任务队列和结果队列注册在网络上def win_run():
    QueueManager.register(
'get_task_queue',callable=get_task)
    QueueManager.register(
'get_result_queue',callable=get_result)
   
# 设置IP地址和端口和口令
   
manager = QueueManager(address = ('127.0.0.1',8001),authkey='kouling'.encode('utf-8'))
    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('put task %s...'%url)
            task.put(url)
       
print('try get result...')
       
for i in range(10):
           
print('result is %s'%result.get(timeout=10))
   
except Exception as e:
       
print('Manager error ',e)
   
finally:
        manager.shutdown()

if __name__=='__main__':
    freeze_support()
    win_run()