Python程式專題8:分佈叢集的訊息傳遞

Mark發表於2019-02-16

上一篇文章:Python程式專題7:託管物件
下一篇文章:Python程式專題9:關於程式的實用工具函式

使用multiprocessing模組的程式不僅可以於執行在同一計算機的其它程式進行訊息傳遞,還可以於位於不到計算機的遠端系統程式進行訊息傳遞。其中的multiprocessing.connection子模組包含該目的的函式和類:

connections.Client(address,family,authenticate,authkey)

連線到另一個程式,此程式必須已經正在監聽地址address。
address:代表網路地址的元組(hostname,port),或者代表UNIX域套接字的檔名,或者代表
r`\servernamepipepipename`形式的字串,代表遠端系統servername(本地計算機的servername為`.`)上的一條Windows命名管道。

family:表示地址格式的字串。一般是`AF_INET`、`AF_UNIX`、或`AF_PIPE`.如果省略此引數,將從address的格式退出它的值。

backlog:是一個整數,當address引數指定了一個網路連線時,對應於傳遞給套接字的listen()方法的值,backlog預設為1。

authenticate:一個布林標誌,指定是否使用摘要身份驗證。
authkey:包含身份驗證金鑰的字串,如果忽略此引數,將使用current_process().authkey的值。

此函式的返回值是Connection物件,管道中有講過。

connections.Listener(address,family,backlog,authenticate,authkey)

實現了一臺伺服器,用於偵聽和處理Client()函式傳送的連線。
如果省略address引數,將選擇預設地址,如果同時省略address和family兩個引數,將選擇本地系統上速度最快的可用通訊模式。

Listener例項listener支援一下方法和屬性。

屬性或方法名 介紹
listener.accept() 接受一個新連線,並返回一個Connetion物件。如果身份驗證失敗,將引發Authentication-Error異常
listener.address 偵聽器正在使用的地址
listener.close() 關閉偵聽器正在使用的管道或套接字
listener.last_accepted 接受的最後一個客戶端的地址。

例項:伺服器端與客戶端傳送訊息

  • 伺服器端程式碼:
#伺服器端,負責監聽客戶端並實現簡單的遠端操作
from multiprocessing.connection import Listener
serv=Listener((``,11111),authkey=`123456`.encode())
while True:
    conn=serv.accept()
    while True:
        try:
            x,y=conn.recv()
        except EOFError:
            print("出錯了")
            break
        result=x+y
        conn.send(result)
    conn.close()
  • 客戶端程式碼:
#客戶端,向伺服器端傳送訊息
from multiprocessing.connection import Client
conn=Client((`localhost`,11111),authkey=`123456`.encode())
conn.send((5,6))
r=conn.recv()
print(r)


conn.send(("mark","帥哥"))
r=conn.recv()
print(r)
conn.close()
  • 客戶端列印結果:
11
mark帥哥

相關文章