編寫用戶端
在toutiao-backend/common/rpc目錄下建立client.py
import grpc
import reco_pb2
import reco_pb2_grpc
import time
def feed_articles(stub):
# 建構rpc調用的調用參數
user_request = reco_pb2.UserRequest()
user_request.user_id = '1'
user_request.channel_id = 1
user_request.article_num = 10
user_request.time_stamp = round(time.time()*1000)
# 通過stub進行方法調用,并接收調用傳回值
ret = stub.user_recommend(user_request)
print('ret={}'.format(ret))
def run():
"""
rpc用戶端調用的方法
"""
# 使用with語句連接配接rpc伺服器
with grpc.insecure_channel('127.0.0.1:8888') as channel:
# 建立調用rpc遠端服務的輔助對象stub
stub = reco_pb2_grpc.UserRecommendStub(channel)
# 通過stub進行rpc調用
feed_articles(stub)
if __name__ == '__main__':
run()
補全服務端
為了友善看到效果,我們編寫補全服務端代碼。
注意:此處實際推薦的代碼在後續推薦系統課程中會涉及到
在toutiao-backend/common/rpc目錄下建立server.py檔案
import reco_pb2
import reco_pb2_grpc
import grpc
from concurrent.futures import ThreadPoolExecutor
import time
# rpc接口定義中服務對應成Python的類
class UserRecommendService(reco_pb2_grpc.UserRecommendServicer):
# 在接口定義的同名方法中補全,被調用時應該執行的邏輯
def user_recommend(self, request, context):
# request是調用的請求資料對象
user_id = request.user_id
channel_id = request.channel_id
article_num = request.article_num
time_stamp = request.time_stamp
response = reco_pb2.ArticleResponse()
response.exposure = 'exposure param'
response.time_stamp = round(time.time()*1000)
recommends = []
for i in range(article_num):
article = reco_pb2.Article()
article.track.click = 'click param {}'.format(i+1)
article.track.collect = 'collect param {}'.format(i+1)
article.track.share = 'share param {}'.format(i+1)
article.track.read = 'read param {}'.format(i+1)
article.article_id = i+1
recommends.append(article)
response.recommends.extend(recommends)
# 最終要傳回一個調用結果
return response
def serve():
"""
rpc服務端啟動方法
"""
# 建立一個rpc伺服器
server = grpc.server(ThreadPoolExecutor(max_workers=10))
# 向伺服器中添加被調用的服務方法
reco_pb2_grpc.add_UserRecommendServicer_to_server(UserRecommendService(), server)
# 微伺服器綁定ip位址和端口
server.add_insecure_port('127.0.0.1:8888')
# 啟動rpc服務
server.start()
# start()不會阻塞,此處需要加上循環睡眠 防止程式退出
while True:
time.sleep(10)
if __name__ == '__main__':
serve()