python分散式程序管理
阿新 • • 發佈:2019-01-23
對分散式程序管理的理解
把多程序分佈到多臺機器上,一個服務程序可以作為排程者,依靠網路通訊將任務將分配到多個程序中,如果有一個通過Queue通訊的多程序程式,將傳送任務的程序和處理任務的程序分佈到兩臺不同的主機上,原有的queue可以繼續使用,單是通過managers模組將Queue通過網路暴露出去,就可以讓其他機器的程序訪問Queue了。
服務程序:負責啟動Queue,把Queue註冊到網路上,然後往Queue裡面寫任務。
管理端
import random from queue import Queue from multiprocessing.managers import BaseManager # 1. 建立任務佇列和任務執行結果的佇列 task_queue = Queue() result_queue = Queue() # 2. 將佇列通過網路暴露出去,讓其他主機可以訪問到佇列; class QueueManager(BaseManager): pass # 3. 將兩個佇列都註冊到網路上, QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue) #4. 繫結一個埠5001, 設定一個與其他主機共同直到的暗號/驗證碼; # 0~65535 manager = QueueManager(address=('', 9999), authkey=b'westos') # 5. 啟動網路訪佇列的物件 manager.start() # 6. 獲取通過網路訪問的物件 task = manager.get_task_queue() result = manager.get_result_queue() # 7. 放幾個任務進去; for i in range(100): n = random.randint(1, 1000) print('任務列表加入任務: %s' %(n)) task.put(n) # 8. 從result佇列讀取任務結果; for j in range(100): r = result.get() print("佇列任務的結果: %s" %(r)) # 8. 關閉 manager.shutdown()
被管理端
在分散式環境下新增任務到Queue不可以直接對原始的task_queue進行操作,那樣就繞過了QueueManager的封裝,必須通過manager.get_task_queue()獲取的Queue介面新增
from multiprocessing.managers import BaseManager import queue #1.建立Queue import time class QueueManager(BaseManager): pass #2.獲取管理端共享出來的佇列,一定要跟管理端註冊的名稱相同 QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') #3.連線到伺服器上 server_addr='172.25.254.77' print("正在連線服務端%s......" %(server_addr)) #4.埠號和密碼要跟管理端保持一致; m=QueueManager(address=(server_addr,9999),authkey=b'westos') #5.進行連線 m.connect() #6.獲取Queue物件 task=m.get_task_queue() result=m.get_result_queue() #7.獲取管理端共享的任務 for i in range(100): try: n=task.get() #模擬處理任務 print('run task %d*%d...' %(n,n)) time.sleep(1) r='%d * %d = %d' %(n,n,n**2) #將執行的任務結果放入結果佇列中 result.put(r) except queue.Empty: print('任務佇列為空..') print('執行結束')