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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值