就比如我们需要抓取某个图片网站的所有图片,如果用我们的分布式进程的思想,我们会创建一个进程负责抓取图片的链接地址,然后将这些链接地址存放到Queue中,另外的进程负责从Queue中读取链接进行图片的下载或者进行其他操作(存在本地)
其实我们的Queue是暴露在网络中的,通过分布式就是将其进行了封装,其实也就是所谓的本地队列的网络化。
接下来,我们来分析一下如何去创建一个分布式的服务进程,总体可以分为六步:
1、首先我们需要建立一个队列queue,这个主要用作进程之间的通信。总体来说就是两种进程,一种是服务进程,一种是任务进程。服务进程创建任务队列task_queue,用作传递任务给任务进程的通道。服务进程又创建result_queue,作为任务进程完成任务后回复服务进程的通道。在分布式进程的环境下,我们需要通过Queuemanager 获得的Queue接口来添加任务。
2、把我们在第 一步中队列在网络上进行注册,暴露给其他的进程或者主机,注册后获得网络队列,相当于本地队列的映像。
3、建立Queuemanager的对象,并且实例化,绑定端口和口令
4、启动第三步中建立的实例,即启动管理manager,监管信息通道
5、通过管理实例的方法获取到通过网络访问的queue对象,也就是把网络对象实体化成本地的一个队列。
6、创建任务到“本地”队列中,自动上传任务到网络队列中,分配给任务进程进行处理。
我们来写一下服务进程的代码 taskManager.py:
import queue
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
# 任务个数
task_num = 500
# 定义收发队列
task_queue = queue.Queue(task_num)
result_queue = queue.Queue(task_num)
def get_task():
return task_queue
def get_result():
return result_queue
# 创建类似的QueueManager
class QueueManager(BaseManager):
pass
def run():
# Windows下绑定调用接口不能使用lambda,所以只能先定义函数再绑定
QueueManager.register('get_task_queue', callable = get_task)
QueueManager.register('get_result_queue', callable=get_result)
#绑定端口并设置验证口令,windows下需要填写ip地址,Linux中不填默认为本地
manager = QueueManager(address=('127.0.0.1', 8001), authkey='jap'.encode('utf-8'))
# 启动
manager.start()
try:
# 通过网络获取任务队列和结果队列
task = manager.get_task_queue()
result = manager.get_result_queue()
# 添加任务
for url in ["JAP君url:"+str(i) for i in range(500)]:
print("添加任务 %s" %url)
task.put(url)
print("正在获取结果...")
for i in range(500):
print("result is %s" %result.get(timeout=10))
except:
print('Manager error')
finally:
# 一定要关闭,否则会报管道未关闭的错
manager.shutdown()
if __name__ == '__main__':
# windows下多进程可能会出现问题,添加这句话可以解决
freeze_support()
run()
看到这里相信多多少少对分布式进程爬虫也有了一些新的理解和感悟,本篇文章主要是针对于大家思路的打开,写代码只是验证思路的一个实验~
下一篇: 没有了
一级建造师二级建造师消防工程师造价工程师土建职称房地产经纪人公路检测工程师建筑八大员注册建筑师二级造价师监理工程师咨询工程师房地产估价师 城乡规划师结构工程师岩土工程师安全工程师设备监理师环境影响评价土地登记代理公路造价师公路监理师化工工程师暖通工程师给排水工程师计量工程师
执业药师执业医师卫生资格考试卫生高级职称护士资格证初级护师主管护师住院医师临床执业医师临床助理医师中医执业医师中医助理医师中西医医师中西医助理口腔执业医师口腔助理医师公共卫生医师公卫助理医师实践技能内科主治医师外科主治医师中医内科主治儿科主治医师妇产科医师西药士/师中药士/师临床检验技师临床医学理论中医理论