windows python多台機器分布式程序

2021-09-02 07:59:03 字數 3305 閱讀 6227

注意細節:關閉防火牆,同一網段

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...