二十五 建立分布式程序

2022-06-30 12:45:12 字數 3564 閱讀 2393

分布式程序指的是將process程序分布到多台機器上,充分利用多台機器的效能完成複雜的任務。

multiprocessing模組不僅支援多程序,而且其中的managers模組還支援把多程序分布到多台機器上。例如,寫乙個服務程序作為排程者,將任務分布到其他多個程序中,依靠網路通訊(將queue暴露到網路中,實現本地佇列的網路化)進行管理。

1、建立佇列queue,用來進行程序間的通訊。

(1)服務程序建立任務佇列task_queue,用來作為傳遞任務給任務程序的通道

(2)服務程序建立結果佇列result_queue,用來作為任務程序完成任務後回覆服務程序的通道

2、把建立的佇列在網路上註冊,暴露給其他程序

(1)通過multiprocessing.managers.basemanage.register建立queue介面來作為新增任務的通道,typeid是呼叫的方法名,callable是繫結的本地獲取queue的方法

3、建立乙個物件(multiprocessing.managers.basemanage)的例項manager,繫結埠和驗證口令

(1)通過multiprocessing.managers.basemanage繫結本地埠,指定authkey,authkey接受bytes型別

4、啟動manager,開始監聽資訊通道

(1)manager.start()

5、通過管理例項的方法(第2步中註冊的typeid的引數)獲得通過網路訪問的queue物件,即再把網路佇列例項化成可以使用的本地佇列

(1)task = manager.get_task_queue()

6、建立任務到本地佇列中,會自動上傳到網路佇列中,分配給任務程序去處理

(1)task.put()

7、關閉例項manager

(1)manager.shutdown()

8、示例**

#

示例**來自《python爬蟲開發與專案實戰》,作者范傳輝

from multiprocessing.managers import

basemanager

import

queue

#建立佇列

task_queue =queue.queue()

result_queue =queue.queue()

#註冊方法,在網路上暴露佇列

#queuemanager.register(typeid="get_task_queue", callable=lambda: task_queue)

#queuemanager.register(typeid='get_result_queue', callable=lambda: result_queue)

basemanager.register(typeid="

get_task_queue

", callable=lambda

: task_queue)

basemanager.register(typeid='

get_result_queue

', callable=lambda

: result_queue)

#建立本例manager例項

address = ('

127.0.0.1

', 8001)

#manager = queuemanager(address=address, authkey=b'biu')

manager = basemanager(address=address, authkey=b'

biu')#

啟動manager.start()

#通過管理例項的方法獲得通過網路訪問的queue物件

task =manager.get_task_queue()

result =manager.get_result_queue()

#新增任務

for url in ["

image_url_

" + str(i) for i in range(10)]:

print('

put task %s...

' %url)

task.put(url)

#獲取返回結果

print("

try get result...")

for i in range(10):

print('

result in %s

' % result.get(timeout=10))

manager.shutdown()

1、使用multiprocessing.managers.basemanager註冊用於獲取queue的方法名稱(任務程序只能通過名稱來在網路上獲取queue)

(1)basemanger.register(typeid='get_task_queue')

2、連線伺服器,埠和驗證口令要與服務程序完全一致

(1)建立manager例項:manager = basemanager(address=address,authkey=b'...')

(2)連線伺服器:manager.connect()

3、本地化網路佇列

(1)task = manager.get_task_queue()

4、從任務佇列獲取任務,將結果寫入result佇列

5、例項**

#

示例**來自《python爬蟲開發與專案實戰》,作者范傳輝

import

time

from multiprocessing.managers import

basemanager

#註冊用於獲取queue的方法名稱

basemanager.register(typeid='

get_task_queue')

basemanager.register(typeid='

get_result_queue')

#連線到伺服器

server_addr = ('

127.0.0.1

', 8001)

print("

connect to server %s

" %str(server_addr))

manager = basemanager(address=server_addr, authkey=b'

biu'

)manager.connect()

#獲取queue物件

task =manager.get_task_queue()

result =manager.get_result_queue()

while

nottask.empty():

image_url = task.get(true,timeout=5)

print('

run task download %s...

' %image_url)

time.sleep(1)

result.put(

"%s ---> success

" %image_url)

#處理結束

print('

worker exit

')

Linux 二十五 動態監控程序

top與ps命令很相似。它們都用來顯示正在執行的程序。top與ps最大的不同之處,在於top在執行一段時間可以更新正在執行的的程序 預設每3秒變化一次 top 選項 選項 說明 d 秒數 指定top命令每隔幾秒更新。預設是3秒在top命令的互動模式當中可以執行的命令 i使top不顯示任何閒置或者僵死...

分布式程序

分布式程序 分布式程序六個步驟 1.建立佇列queue,用來程序間的通訊。2.將佇列queue進行網路共享給其他程序 3.建立物件例項,繫結埠和驗證口令 4.啟動物件例項進行資訊傳輸管理 5.通過物件例項將網路佇列本地化 6.分配本地化佇列進行程序任務處理 排程服務程序taskmanager.py ...

分布式程序

分布式程序指的是將process程序分布的多台機器上,充分利用多台機器的效能完成複雜的任務,我們可以將這點應用的分布式爬蟲的開發中。我們舉個簡單例子,服務程序用來設定任務在task queue,並設定介面。任務程序呼叫相同的介面,執行任務,結果寫進result queue taskmanager.p...