分布式程序指的是將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...