python分布式編程實現(xiàn)過程解析
分布式編程的難點在于:
1.服務(wù)器之間的通信,主節(jié)點如何了解從節(jié)點的執(zhí)行進度,并在從節(jié)點之間進行負(fù)載均衡和任務(wù)調(diào)度;
2.如何讓多個服務(wù)器上的進程訪問同一資源的不同部分進行執(zhí)行
第一部分涉及到網(wǎng)絡(luò)編程的底層細(xì)節(jié)
第二個問題讓我聯(lián)想到hdfs的一些功能。
首先分布式進程還是解決的是單機單進程無法處理的大數(shù)據(jù)量大計算量的問題,希望能加通過一份代碼(最多主+從兩份)來并行執(zhí)行一個大任務(wù)。
這就面臨兩個問題,首先將程序分布到多臺服務(wù)器,其次將輸入數(shù)據(jù)分配給多臺服務(wù)器。
第一個問題相對比較簡單,畢竟程序一般不會太長,即便是超級jar包的spark程序,也不過百兆。
但數(shù)據(jù)里不同,如今企業(yè)級別的數(shù)據(jù)動輒GB、TB,如果在分布式程序執(zhí)行之前首先要進行大容量數(shù)據(jù)的轉(zhuǎn)移,顯然是不可取的。
這時候我們就需要一個中央共享數(shù)據(jù)源,所有服務(wù)器都可以對這個數(shù)據(jù)源進行并行存?。▔Kblock),這就已經(jīng)非常接近hdfs的功能。
因為在hdfs中,集群中的多臺服務(wù)器共享同一個hdfs,每臺機器訪問hdfs就像訪問本地數(shù)據(jù)一樣(還是稍微慢一點);
計算任務(wù)執(zhí)行完之后,每臺服務(wù)器還可以將自己的計算結(jié)果寫回hdfs,每臺服務(wù)器的結(jié)果被存儲成了結(jié)果目錄中的小文件。
# task_master.py import random, time, queue from multiprocessing.managers import BaseManager # 發(fā)送任務(wù)的隊列: task_queue = queue.Queue() # 接收結(jié)果的隊列: result_queue = queue.Queue() # 從BaseManager繼承的QueueManager: class QueueManager(BaseManager): pass # 把兩個Queue都注冊到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對象: QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue) # 綁定端口5000, 設(shè)置驗證碼'abc': manager = QueueManager(address=('', 5000), authkey=b'abc') # 啟動Queue: manager.start() # 獲得通過網(wǎng)絡(luò)訪問的Queue對象: task = manager.get_task_queue() result = manager.get_result_queue() # 放幾個任務(wù)進去: for i in range(10): n = random.randint(0, 10000) print('Put task %d...' % n) task.put(n) # 從result隊列讀取結(jié)果: print('Try get results...') for i in range(10): r = result.get(timeout=10) print('Result: %s' % r) # 關(guān)閉: manager.shutdown() print('master exit.')
# task_worker.py import time, sys, queue from multiprocessing.managers import BaseManager # 創(chuàng)建類似的QueueManager: class QueueManager(BaseManager): pass # 由于這個QueueManager只從網(wǎng)絡(luò)上獲取Queue,所以注冊時只提供名字: QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') # 連接到服務(wù)器,也就是運行task_master.py的機器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和驗證碼注意保持與task_master.py設(shè)置的完全一致: m = QueueManager(address=(server_addr, 5000), authkey=b'abc') # 從網(wǎng)絡(luò)連接: m.connect() # 獲取Queue的對象: task = m.get_task_queue() result = m.get_result_queue() # 從task隊列取任務(wù),并把結(jié)果寫入result隊列: for i in range(10): try: n = task.get(timeout=1) print('run task %d * %d...' % (n, n)) r = '%d * %d = %d' % (n, n, n*n) time.sleep(1) result.put(r) except Queue.Empty: print('task queue is empty.') # 處理結(jié)束: print('worker exit.')
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
openCV-Python筆記之解讀圖像的讀取、顯示和保存問題
這篇文章主要介紹了openCV-Python筆記之解讀圖像的讀取、顯示和保存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Python中你應(yīng)該知道的一些內(nèi)置函數(shù)
python提供了內(nèi)聯(lián)模塊buidin,該模塊定義了一些軟件開發(fā)中常用的函數(shù),這些函數(shù)實現(xiàn)了數(shù)據(jù)類型的轉(zhuǎn)換,數(shù)據(jù)的計算,序列的處理等功能。下面這篇文章主要給大家介紹了Python中一些大家應(yīng)該知道的內(nèi)置函數(shù),文中總結(jié)的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-03-03python機器學(xué)習(xí)實戰(zhàn)之最近鄰kNN分類器
這篇文章主要介紹了python機器學(xué)習(xí)實戰(zhàn)之最近鄰kNN分類器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12