Python中實現(xiàn)遠程調用(RPC、RMI)簡單例子
遠程調用使得調用遠程服務器的對象、方法的方式就和調用本地對象、方法的方式差不多,因為我們通過網絡編程把這些都隱藏起來了。遠程調用是分布式系統(tǒng)的基礎。
遠程調用一般分為兩種,遠程過程調用(RPC)和遠程方法調用(RMI)。
RPC
RPC屬于函數(shù)級別的遠程調用,其多是通過HTTP傳輸數(shù)據(jù),數(shù)據(jù)形式有XML、JSON、序列化數(shù)據(jù)等。在此,用python做一個xml-rpc的示例。 先給服務器端server.py:
from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(x, y):
return x + y
if __name__ == '__main__':
s = SimpleXMLRPCServer(('127.0.0.1', 8080))
s.register_function(add)
s.serve_forever()
s是一個綁定了本地8080端口的服務器對象,register_function()方法將函數(shù)add注冊到s中。serve_forever()啟動服務器。 再給個客戶端client.py:
from xmlrpclib import ServerProxy
if __name__ == '__main__':
s = ServerProxy("http://127.0.0.1:8080")
print s.add(3,4)
現(xiàn)在,運行server.py,然后運行client.py,client.py所在的console會輸出7。
我們用wireshark看一下這期間傳遞的數(shù)據(jù)是什么樣子的,請求的數(shù)據(jù):
<?xml version='1.0' ?>
<methodCall>
<methodName>
add
</methodName>
<params>
<param>
<value>
<int> 3 </int>
</value>
</param>
<param>
<value>
<int> 4 </int>
</value>
</param>
</params>
</methodCall>
響應的數(shù)據(jù):
<?xml version='1.0' ?>
<methodResponse>
<params>
<param>
<value>
<int> 7 </int>
</value>
</param>
</params>
</methodResponse>
好吧,言簡意賅,不做贅述。
RMI
RMI意為遠程方法調用,粒度比RPC要大,因為它的基本單位是對象。其大致思路是這樣的:創(chuàng)建RMI服務器對象,將實例化的某個對象以指定的服務名稱(也可以是多個對象,但是服務名稱不應相同)注冊到RMI服務器對象中,之后啟動RMI服務器。服務器等待客戶端發(fā)送的數(shù)據(jù)(包括服務名稱、函數(shù)名、參數(shù)),將處理結果返回給客戶端。 Pyro4是一個基于python的RMI實現(xiàn),下面我們用Pyro4創(chuàng)建一個RMI服務器,請看server2.py:
import Pyro4
class GreetingMaker(object):
def get_fortune(self, name):
return "Hello, {0}. \n" .format(name)
greeting_maker=GreetingMaker()
daemon=Pyro4.Daemon()
uri=daemon.register(greeting_maker)
print "Ready. Object uri =", uri
daemon.requestLoop()
uri變量是Pyro4用自己的方法為greeting_maker對象生成的uri,其中包括套接字以及為greeting_maker生成的唯一的id。這個id相當于服務名稱,當然也可以指定更易懂的服務名稱。下面是客戶端client2.py:
import Pyro4
uri=raw_input(" Pyro uri : ").strip()
name=raw_input("Your name: ").strip()
greeting_maker=Pyro4.Proxy(uri)
print greeting_maker.get_fortune(name)
這其中要輸入的uri也就是server2.py生成的uri。通過給Pyro4.Proxy傳遞greeting_maker的uri,可以認為和服務器端的greeting_maker建立的連接,然后調用greeting_maker的get_fortune()方法。如果name是letian,那么print greeting_maker.get_fortune(name)的結果是Hello, letian.。
相關文章
面向新手解析python Beautiful Soup基本用法
這篇文章主要介紹了面向新手解析python Beautiful Soup基本用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
Python3 socket即時通訊腳本實現(xiàn)代碼實例(threading多線程)
這篇文章主要介紹了Python3 socket即時通訊腳本實現(xiàn)代碼實例(threading多線程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Windows環(huán)境下如何使用Pycharm運行sh文件
這篇文章主要介紹了Windows環(huán)境下如何使用Pycharm運行sh文件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
Python使用jsonpath-rw模塊處理Json對象操作示例
這篇文章主要介紹了Python使用jsonpath-rw模塊處理Json對象操作,結合實例形式分析了Python使用requests與response處理json的方法,并給出了jsonpath_rw模塊操作json對象的基本示例,需要的朋友可以參考下2018-07-07

