分布式进程指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。我们可以将这一点应用到分布式爬虫的开发中。

    比如:在做爬虫程序时,常常会遇到这样的场景,我们想抓取某个网站的所有图片,如果是引用多进程的话,一般是一个进程负责抓取图片的链接地址,将链接地址存放到Queue中,另外的进程负责从Queue中读取链接地址进行下载和存储到本地。现在我们用这个分布式进程来做的话,一台机器上的进程负责抓取链接,其他机器上的进程负责下载存储。

一.服务进程,分为6个步骤:

# -*- coding:utf-8 -*-
import Queuefrom multiprocessing.managers import  BaseManager
from multiprocessing 
import freeze_support
import timeimport random
# 任务个数
task_number = 10
# 定义收发队列
#  第一步:建立task_queue和result_queue,用来存放任务和结果
task_queue = Queue.Queue(task_number)
result_queue = Queue.Queue(task_number
)# win下不支持lambda,所以定义方法,linux下可以直接用lambda(下面已给出)
def get_task():
    return task_queuedef 
get_result():
    return result_queue
# 创建类似的QueueManager
class QueueManager(BaseManager):
    pass
def win_run():
    # linux下可以直接用lambda
    #QueueManager.register('get_task_queue',callable=lambda:task_queue)
    #    第二步:创建2个队列注册在网络上
    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 = 'keke')
    #    第四步:启动管理,监听信息通道
    manager.start()
    #    第五步:通过管理实例的方法获得通过网络访问的Queue对象
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 第六步:添加任务
    # 接受任务
    while 1:
        task.put(random.randint(100,999))
        time.sleep(4)
        print result.get()
    manager.shutdown()
if __name__ == '__main__':
    # win下调用freeze_support,linux可以不用
    freeze_support()
    win_run()

二.任务进程,分为4个步骤:   

# -*- coding:utf-8 -*-
import time
import random
from multiprocessing.managers import  BaseManager

class QueueManager(BaseManager):
    pass
#    第一步:使用QueueManager注册用于获取Queue的方法名称    
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
#    第二步:链接到服务器
m = QueueManager(address=('127.0.0.1',8001), authkey='keke')
m.connect()
#    第三步:获取Queue对象
task = m.get_task_queue()
result = m.get_result_queue()
#    第四步:从task队列中获取任务,并把结果返回到result队列中
while 1:
    time.sleep(2)
    print task.get(), 11111111
    result.put(random.randint(1,10))

效果图如下: 




本内容参考:范伟辉编著的《Python爬虫开发与项目实战》