本篇內容介紹了“Python如何使用RPC”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
所謂RPC,是遠程過程調用(Remote Procedure Call)的簡寫,網上解釋很多,簡單來說,就是在當前進程調用其他進程的函數時,體驗就像是調用本地寫的函數一般。
本文實現的是在本地調用遠端的類class對象的接口,也就是本地的client不實例化類對象,調用的是server端的類對象接口。
為了達到讓調用層無須關心底層實現,擁有絲滑般的體驗,就需要以下幾個部分:
客戶端需要把類的接口提取出來,并將調用函數事件捕獲存儲起來;服務端需要把類的公有函數作為可遠程調用的接口。
客戶端把調用函數的事件(調用的函數,參數)進行序列化并發送給服務端;服務端將客戶端的調用事件反序列化,并執行相應的接口,將返回值發送給客戶端。
客戶端與服務端通過某種方式(一般就是網絡socket)進行通信。
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()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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。