注意細節:關閉防火牆,同一網段
python的 mutiprocessing 模組支援多程序,且其子模組managers 支援分布式,在多台機器上執行。而thread只能分布在同一臺機器的多個cpu上。
傳送任務的程序 和處理任務的程序,分布在兩台機器上。
注意:同一臺機器上寫多程序時,queue佇列可以直接使用,但是分布式多程序條件下,新增任務刅queue不可以直接對原始的task_queue 操作。需要通過封裝,繼承類basemanager,獲得的新queue新增。
**task_master.py 和 task_worker.py`
#_*_ conding:utf-8 _*_
#task_master.py
import random,time,queue
from multiprocessing.managers import basemanager
from multiprocessing import freeze_support
task_queue = queue.queue() # 傳送任務的佇列:
result_queue = queue.queue() # 接收結果的佇列:
class queuemanager(basemanager): # 從basemanager繼承的
pass
# windows下執行
def return_task_queue():
global task_queue
return task_queue # 返回傳送任務佇列
def return_result_queue ():
global result_queue
return result_queue # 返回接收結果佇列
def test():
# 把兩個queue都註冊到網路上, callable引數關聯了queue物件,它們用來進行程序間通訊,交換物件
queuemanager.register('get_task_queue', callable=return_task_queue)
queuemanager.register('get_result_queue', callable=return_result_queue)
# 繫結埠5000, 設定驗證碼'abc':
#manager = queuemanager(address=('', 5000), authkey=b'abc')
# windows需要寫ip位址
manager = queuemanager(address=('198.8.8.8', 5000), authkey=b'abc')
manager.start() # 啟動queue:
# 獲得通過網路訪問的queue物件:
task = manager.get_task_queue()
result = manager.get_result_queue()
for i in range(10): # 放幾個任務進去:
n = random.randint(0, 10000)
print('put task %d...' % n)
task.put(n)
# 從result佇列讀取結果:
print('try get results...')
for i in range(10):
# 這裡加了異常捕獲
try:
r = result.get(timeout=5)
print('result: %s' % r)
except queue.empty:
print('result queue is empty.')
# 關閉:
manager.shutdown()
print('master exit.')
if __name__=='__main__':
freeze_support()
print('start!')
test()
在task_worker.py中:
# task_worker.py
import time, sys, queue
from multiprocessing.managers import basemanager
# 建立類似的queuemanager:
class queuemanager(basemanager):
pass
# 由於這個queuemanager只從網路上獲取queue,所以註冊時只提供名字:
queuemanager.register('get_task_queue')
queuemanager.register('get_result_queue')
# 連線到伺服器,也就是執行task_master.py的機器:
server_addr = '198.8.8.8'
print('connect to server %s...' % server_addr)
# 埠和驗證碼注意保持與task_master.py設定的完全一致:
m = queuemanager(address=(server_addr, 5000), authkey=b'abc')
# 從網路連線:
m.connect()
# 獲取queue的物件:
task = m.get_task_queue()
result = m.get_result_queue()
# 從task佇列取任務,並把結果寫入result佇列:
for i in range(10):
try:
n = task.get(timeout=1)
print('run task %d ' % n)
r = n*n
time.sleep(1)
result.put(r)
except queue.empty:
print('task queue is empty.')
# 處理結束:
print('worker exit.')
queuemanager 實現了queue的網路訪問,但由於queuemanager管理的不止乙個queue,所以需要給每個queue的網路呼叫介面取名字,比如此處的get_task_queue。 task_worker.py中註冊的名字必須和task_manager中註冊的一致authkey也需一致。
Windows Python 命令列如何退出
在使用 python 命令列工具的時候,我們發現通常使用的 ctrl c 沒有辦法退出介面。例如,下圖所示,當我們從鍵盤上輸出 ctrl c 還是沒有辦法退出。可以通過鍵盤上輸入 ctrl z 然後回車後退出環境。當然,你還可以使用 exit 或者 quit 然後回車後退出。如下面的圖顯示,我們可以...
安裝多台tomcat配置
在開發中,有事根據需求需要使用到多台tomcat來完成不同專案的需求,當有兩台或者以上的tomcat同時啟動的時候就會發生埠衝突,所以就需要更改第二台以及以後的tomcat的埠,操作如下 1 這裡就不闡述tomcat的安裝了,安裝的過程很簡單,網上有很多的資料 2 找到需要修改的tomcat的安裝目...
windows執行多台tomcat
系統變數 新增乙個新的catalina base2 catalina home2,值為新tomcat的位址 修改配置檔案tomcat bin catalina.bat startup.bat,修改新的tomcat中的startup.bat,把其中的catalina home改為catalina ho...