1.看{python爬蟲開發與項目實戰}中關於分佈式進程的介紹,一直卡在這個知識點,書中的這個例子描述是在不一樣電腦上進行運行的,但這裏有一個前提:兩臺電腦的網段需相同,因此,編程練習時,對着兩臺電腦一直找問題,始終沒解決。python
2.書中關於ip地址是127.0.0.1,這個地址是迴環地址,在同一臺機器上,開兩個cmd 或者pycharm輸入書中的程序能夠進行數據傳輸,另外也能夠改爲本身電腦的ip(個人192.168.103.130),在同一臺電腦上運行編程
3.本身思考了一段時間,書中的例子實際上是爲了採用網絡隊列進行不一樣電腦的數據交互,但不一樣的電腦網段需相同。我這裏不知足要求,索性用了一臺電腦進行數據交互,開兩個程序,至關於開了兩個進程,也屬於分佈式進程,但比較特殊罷了服務器
題目:採用分佈式進程,一臺電腦a進行傳輸一系列的網址,另外一臺電腦b分別打開網址,並返回相應的網址字節數。網絡
服務器端:app
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()
客戶端:python爬蟲
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')
調試結果:本程序是在同一臺電腦打開兩個程序運行的分佈式
服務器端:url
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
客戶端:spa
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