1. 程式人生 > >python分散式程序管理

python分散式程序管理

對分散式程序管理的理解
把多程序分佈到多臺機器上,一個服務程序可以作為排程者,依靠網路通訊將任務將分配到多個程序中,如果有一個通過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('執行結束')