Python遠端方法呼叫實現過程解析

2022-09-29 14:00:10 字數 2279 閱讀 3899

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