Python使用RPC例子

主要內容

所謂RPC,是遠程過程調用(Remote Procedure Call)的簡寫,網上解釋很多,簡單來說,就是在當前進程調用其他進程的函數時,體驗就像是調用本地寫的函數一般。

本文實現的是在本地調用遠端的類class對象的接口,也就是本地的client不實例化類對象,調用的是server端的類對象接口。

為瞭達到讓調用層無須關心底層實現,擁有絲滑般的體驗,就需要以下幾個部分:

  • 客戶端需要把類的接口提取出來,並將調用函數事件捕獲存儲起來;服務端需要把類的公有函數作為可遠程調用的接口。
  • 客戶端把調用函數的事件(調用的函數,參數)進行序列化並發送給服務端;服務端將客戶端的調用事件反序列化,並執行相應的接口,將返回值發送給客戶端。
  • 客戶端與服務端通過某種方式(一般就是網絡socket)進行通信。

遠程過程調用RPC常用與分佈式計算,對應Python庫名為rpyc;

from multiprocessing import Pool
from rpyc import Service  
from rpyc.utils.server import ThreadedServer  
  
class RemoteService(Service):  
 
    def on_connect(self, conn):
        print(conn)
 
    '''供客戶端調用的方法前得加exposed_'''
    def exposed_search(self, data):  
        print(data)
        data['result'] = 'ok'
        return data  
 
def main(port):
    sr = ThreadedServer(service=RemoteService, hostname='127.0.0.1', port=port, auto_register=False)  
    print(f'Server IP: {(sr.host,sr.port)}')
    sr.start()  
 
if __name__ == '__main__':
    pool = Pool(processes=2)
    pool.apply_async(main, args=(9998,))
    pool.apply_async(main, kwds={'port':9999})
    pool.close()
    pool.join()

上段為rpyc服務端,下段為rpyc調用端;

import rpyc
import time
from multiprocessing import Pool
 
def search_db(query,port):
    conn = rpyc.connect('localhost',port)
    '''調用時省略exposed_'''
    result = conn.root.search(query)
    time.sleep(1)
    print(result)
    conn.close()
 
if __name__ == '__main__':
    pool = Pool(processes=2)
    pool.apply_async(search_db, args=({"match": {'name': 'user'}}, 9998))
    pool.apply_async(search_db, kwds={'query': {"match": {'name': 'user'}},'port':9999})
    pool.close()
    pool.join()

到此這篇關於Python使用RPC例子的文章就介紹到這瞭,更多相關Python使用RPC內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: