python grpc示例

1.環境安裝:

pip install grpcio

pip install protobuf

pip install grpcio-tools

2.新建proto文件grpchello.proto,定義接口,內容如下:

syntax = "proto3";
package grpcDemo;

message HelloRequest {
   string name = 1;
}

message HelloReply {
   string message = 1;
}

message CalcRequest {
   int32 para1 = 1;
   int32 para2 = 2;
   string para3 = 3;
}

message CalcReply {
   int32 ret = 1;
}

service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc Calc(CalcRequest) returns (CalcReply) {}
}

4.運行命令生成proto對應語言的描述文件(protobuf描述文件及grpc的描述文件)

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. grpchello.proto 

(運行的命令太長不好記憶,一般建立腳本文件保存該命令,下次要運行命令只要運行對應腳本文件就行)

運行命令會生成protobuf對應描述文件grpchello_pb2.py和grpc對應描述文件grpchello_pb2_grpc.py,這兩個文件供客戶端和服務端使用

5.實現服務端server.py

#coding=utf-8
from concurrent import futures
import time
import grpc
import grpchello_pb2
import grpchello_pb2_grpc



_ONE_DAY_IN_SECONDS = 60 * 60 * 24

#繼承接口基類,並實現基類中的方法
class MyServer(grpchello_pb2_grpc.gRPCServicer):
    def SayHello(self, request, context):
        print(request.name)
        message = "hello,this is my test result:" + request.name
        return grpchello_pb2.HelloReply(message = message)
    def Calc(selr, request, context):
        print("req.para1:" + str(request.para1))
        print("req.para2:" + str(request.para2))
        print("req.para3:" + str(request.para3))
        ret = 0
        if request.para3 == "+":
            ret = request.para1 + request.para2
        elif request.para3 == "-":
            ret = request.para1 - request.para2
        elif request.para3 == "*":
            ret = request.para1 * request.para2
        elif request.para3 == "/":
            ret = request.para1 / request.para2
        else:
            ret = 0
        print(str(request.para1) + str(request.para3) + str(request.para2) + "=" + str(ret))
        return grpchello_pb2.CalcReply(ret = ret)


def serve():
    #設置服務線程數
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    #註冊服務
    grpchello_pb2_grpc.add_gRPCServicer_to_server(MyServer(), server)
    #設置服務ip和port
    server.add_insecure_port('[::]:50051')
    print("sever is opening ,waiting for message...")
    #非阻塞啓動
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == "__main__":
    serve()

6.實現客戶端client.py

#coding:utf-8
from __future__ import print_function

import grpc

import grpchello_pb2
import grpchello_pb2_grpc


def run():
    channel = grpc.insecure_channel('localhost:50051')#這個是線程這全的通道
    stub = grpchello_pb2_grpc.gRPCStub(channel)

    

    #建立的連接是長邊接,服務關閉重啓後會自動重連
    while True:
        try:
            response = stub.SayHello(grpchello_pb2.HelloRequest(name="hello, this is my test request!"))
            print("Greeter client received: " + response.message)
            response = stub_2.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "+"))
            print(response)
            response = stub_2.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "-"))
            print(response)
            response = stub.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "*"))
            print(response)
            response = stub.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "/"))
            print(response)
        except Exception,err:
            print(err)
            return


if __name__ == "__main__":
    run()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章