Python技術手冊:在不同的解釋器之間進行通信

來自專欄進擊的代碼

當我們運行多個python解釋器實例,還有可能是在不同的機器上時,我們可能會需要通過消息在不同的解釋器之間交換數據。

我們需要的不是複雜的消息隊列,而是簡單的交換無損信息的話,那麼multiprocessing.connection庫正是我們所需要的。只需要使用幾個簡單的原語便可以輕鬆將各個解釋器聯繫在一起並交換數據了。

下面看示例:

#一號解釋器運行扮演伺服器角色from multiprocessing.connection import Listenerdef client(conn): while True: try: msg = conn.recv() print(fServer receive the msg:{msg}) conn.send(Got it) except: print(Server Error) breakdef server(address,authkey): serv = Listener(address,authkey=authkey) while True: try: clients = serv.accept() client(clients) except: print(Server Error) breakserver((,25000),authkey=bAmosH

上面的代碼是一號解釋器的伺服器代碼,下面是運行時的效果圖:

可以看到,所有由send()方法發送的對象都完整無損的被recv()方法接收到了。任何同pickle兼容的對象都可以在連接之間傳遞和接收。

如果知道這些解釋器會運行在同一台機器上,那麼可以利用網路作為替代方案。比如使用UNIX的域socket或者Windows的命名管道,只要簡單的把地址改為文件名就可以了,示例如下:

#UNIXs = Listener(/tmp/myconn,authkey = authkey)#Windowss = Listener(r\.pipemyconn,authkey = authkey)

一般來說,不應該使用multiprocessing模塊來實現面向公眾型的服務。傳遞給Client()和Server()的authkey在這裡是為了幫助認證連接兩端的節點。使用錯誤的密鑰來連接會產生異常。

注意,這個模塊最好適用於能夠長時間運行的連接,而不是大量的短連接。

如果需要對連接實現更多的底層控制,那麼就不要使用multiprocessing模塊。比方說,如果要支持超時、非阻塞I/O或者任何類似的特性,那麼最好使用另一個不同的庫或者直接在socket上實現這些特性。


微信公眾號:進擊的代碼Amos

每天更新Java、python學習資料、技術乾貨。分享見解,共同成長。

關注公眾號,免費獲取眾多電子版經典教材。

推薦閱讀:

相关文章