rpchandler 和 rpcproxy 的基本思路是很比較簡單的。 如果乙個客戶端想要呼叫乙個遠端函式,比如 foo(1, 2, z=3) ,**類建立乙個包含了函式名和引數的元組 (『foo', (1, 2), ) 。 這個元組被pickle序列化後通過網路連線發生出去。 這一步在 rpcproxy 的 getattr() 方法返回的 do_rpc() 閉包中完成。
伺服器接收後通過pickle反序列化訊息,查詢函式名看看是否已經註冊過,然後執行相應的函式。 執行結果(或異常)被pickle序列化後返回傳送給客戶端。例項需要依賴 multiprocessing 進行通訊。 不過,這種方式可以適用於其他任何訊息系統。例如,如果你想在zeromq之上實習rpc, 僅僅只需要將連線物件換成合適的zeromq的socket物件即可。
先實現server端
import json
from mult import listener
from threading import thread
class rpchandler:
def __init__(self):
self._functions = {}
def register_function(self, func):
self._functions[func.__name__] = func
def handle_connection(self, connection):
try:
while true:
func_name, args, kwargs = json.loads(connection.recv())
# run the rpc and send a response
try:
r = self._functions[func_name](*args, **kwargs)
connection.send(json.dumps(r))
except exception as e:
connection.send(json.dmrexjjnvfumps(e))
except eoferror:
pass
def rpc_server(handler, address, authkey):
sock = listener(address, authkey=authkey)
while true:
client = sock.accept()
t = thread(target=handler.handle_connection, args=(client,))
t.daemon = true
t.start()
# some remote functions
def add(x,y):
return x+y
if __name__ == '__main__':
handler = rpchandler()
handler.register_function(add)
程式設計客棧# run the server
rpc_server(handler, ('127.0.0.1', 17000), authkey=b'peekaboo')
再實現client端
import json
from multiprocessing.connection import client
class rpcproxy:
def __init__(self, connection):
self._connection = connection
def __getattr__(self, name):
def do_rpc(*args, **kwargs):
self._connection.send(json.dumps((name, args, kwargs)))
result = json.loads(self._connection.recv())
if isinstance(result, exception):
raise result
return resul程式設計客棧t
return do_rpc
__name__ == '__main__':
c = client(('127.0.0.1', 17000), authkey=b'peekaboo')
proxy = rpcproxy(c)
res = proxy.add(2, 3)
print(res)
本文標題: python遠端方法呼叫實現過程解析
本文位址:
Python 實現遠端方法呼叫
在乙個訊息傳輸層如 sockets multiprocessing connections 或 zeromq 的基礎之上實現乙個簡單的遠端過程呼叫 rpc server.py import pickle from multiprocessing.connection import listener ...
python實現rpc遠端呼叫
遠端呼叫就是將物件名 函式名 引數等傳遞給遠端伺服器,伺服器將處理結果返回給客戶端。遠端呼叫使得呼叫遠端伺服器的物件 方法的方式就和呼叫本地物件 方法的方式差不多,因為我們通過網路程式設計把這些都隱藏起來了。遠端呼叫是分布式系統的基礎。遠端呼叫一般分為兩種,遠端過程呼叫 rpc 和遠端方法呼叫 rm...
python 實現呼叫遠端介面
在python中我們可以使用requests模組來實現呼叫遠端介面 一 安裝requests模組 pip install requests二 使用requests模組實現get方式呼叫遠端介面 使用get方式呼叫遠端介面主要使用了requests模組的get方法 requests.get get方法...