1.看{python爬虫开发与项目实战}中关于分布式进程的介绍,一直卡在这个知识点,书中的这个例子描述是在不同电脑上进行运行的,但这里有一个前提:两台电脑的网段需相同,所以,编程练习时,对着两台电脑一直找问题,始终没解决。
2.书中关于ip地址是127.0.0.1,这个地址是回环地址,在同一台机器上,开两个cmd 或者pycharm输入书中的程序可以进行数据传输,另外也可以改成自己电脑的ip(我的192.168.103.130),在同一台电脑上运行
3.自己思考了一段时间,书中的例子其实是为了采用网络队列进行不同电脑的数据交互,但不同的电脑网段需相同。我这里不满足要求,索性用了一台电脑进行数据交互,开两个程序,相当于开了两个进程,也属于分布式进程,但比较特殊罢了
题目:采用分布式进程,一台电脑a进行传输一系列的网址,另一台电脑b分别打开网址,并返回相应的网址字节数。
服务器端:
from multiprocessing.managers import BaseManager from multiprocessing import freeze_support import queue task_number=3 task_queue = queue.Queue() result_queue = queue.Queue() list1=['http://baidu.com','http://xiaomi.com','http://huawei.com'] def get_task(): global task_queue return task_queue def get_result(): global result_queue 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) manager =QueueManager(address=('192.168.103.130', 20001), authkey=b'qiye') manager.start() try: task = manager.get_task_queue() result = manager.get_result_queue() for i in list1: print('transparenting url:', i) task.put(i) print('try to get the details of url') print('the url details is as follows:') for i in range(len(list1)): print(list1[i],":", result.get(True, timeout=20)) except: print('manger is error') finally: manager.shutdown() if __name__ == "__main__": freeze_support() win_run()
客户端:
from multiprocessing.managers import BaseManager import queue,time,urllib.request class QueueManager(BaseManager): pass if __name__ == "__main__": list1=[] list2=[] QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') m =QueueManager(address=('192.168.103.130', 20001), authkey=b'qiye') m.connect() task=m.get_task_queue() result=m.get_result_queue() while(not task.empty()): imageurl=task.get(True,timeout=20) list1.append(imageurl) print('opening ',imageurl) a=urllib.request.urlopen(imageurl) data=a.read() b=len(data) print( imageurl,'the url data is',b) list2.append(b) result.put(b) print('game over')
调试结果:本程序是在同一台电脑打开两个程序运行的
服务器端:
transparenting url: http://baidu.com transparenting url: http://xiaomi.com transparenting url: http://huawei.com try to get the details of url the url details is as follows: http://baidu.com : 81 http://xiaomi.com : 324657 http://huawei.com : 128494
客户端:
opening http://baidu.com http://baidu.com the url data is 81 opening http://xiaomi.com http://xiaomi.com the url data is 324657 opening http://huawei.com http://huawei.com the url data is 128494 game over