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!
推薦閱讀:
- 解決Python 進程池Pool中一些坑
- python基礎之並發編程(二)
- 一篇文章帶你搞定Python多進程
- 分析詳解python多線程與多進程區別
- python中multiprosessing模塊的Pool類中的apply函數和apply_async函數的區別