Python-grpc工具学习

什么是grpc

https://grpc.io/docs/what-is-grpc/introduction/

Python一般性步骤

一般要经历以下几步:

  1. 定义消息格式
  2. 创建server代码并定义函数
  3. 创建client代码

定义消息格式

假如我们有一个服务器,服务器有两个参数:

  • a = 1
  • b = 2

然后有一个客户端,想要请求a变量或者b变量的值。首先我们新建文件:myHello.proto,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
syntax = "proto3";

// The greeting service definition.
service SendVariableValue {
rpc Send (Param) returns (ParamValue) {}
}

// The request message
message Param {
string param=1;
}

// The response message containing the greetings
message ParamValue {
string param=1;
float value=2;
}

上面的代码定义了以下东西:

  • 一个数据请求服务,对应函数可理解为:ParamValue = Send(Param)
  • Param 的具体信息
  • ParamValue 的具体信息

有了proto文件之后,我们到文件目录下,在终端运行一下代码:

1
python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. myHello.proto

上述代码会产生两个新文件:

  • myHello_pb2.py:用来和 protobuf 数据进行交互
  • myHello_pb2_grpc.py:用来和 grpc 进行交互

创建 server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import grpc

import myHello_pb2
import myHello_pb2_grpc
from concurrent import futures
import time


class SendVariable(myHello_pb2_grpc.SendVariableValueServicer):
def Send(self, request, context):
print("This is request: ", request)
return myHello_pb2.ParamValue(param='good', value=1.1)


def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
myHello_pb2_grpc.add_SendVariableValueServicer_to_server(SendVariable(), server)
server.add_insecure_port('[::]:50011')
print("server starts, waiting")
server.start()
try:
while True:
time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
server.stop(0)


if __name__ == '__main__':
serve()

创建 client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import grpc
import myHello_pb2
import myHello_pb2_grpc


def run():
channel = grpc.insecure_channel('localhost:50011')
stub = myHello_pb2_grpc.SendVariableValueStub(channel)
response = stub.Send(myHello_pb2.Param(param='good'))
print("received: ", response.param, response.value)


if __name__ == '__main__':
run()
Thanks for rewarding