作者:夜夜0603 | 来源:互联网 | 2023-07-24 15:07
篇首语:本文由编程笔记#小编为大家整理,主要介绍了python的gRPC示例相关的知识,希望对你有一定的参考价值。
参考URL:
https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
一,
// 文件名 hello.proto
syntax = "proto3";
package hello;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user‘s name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto
生成了两个文件:
hello_pb2.py
此文件包含生成的 request(HelloRequest
) 和 response(HelloReply
) 类。
hello_pb2_grpc.py
此文件包含生成的 客户端(GreeterStub
)和服务端(GreeterServicer
)的类。
虽然现在已经生成了服务端和客户端代码,但是我们还需要手动实现以及调用的方法。
from concurrent import futures
import time
import grpc
import hello_pb2
import hello_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Greeter(hello_pb2_grpc.GreeterServicer):
# 工作函数
def SayHello(self, request, context):
return hello_pb2.HelloReply(message=‘Hello, %s!‘ % request.name)
def serve():
# gRPC 服务器
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port(‘[::]:50051‘)
server.start() # start() 不会阻塞,如果运行时你的代码没有其它的事情可做,你可能需要循环等待。
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == ‘__main__‘:
serve()
from __future__ import print_function
import grpc
import hello_pb2
import hello_pb2_grpc
def run():
channel = grpc.insecure_channel(‘localhost:50051‘)
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(hello_pb2.HelloRequest(name=‘goodspeed‘))
print("Greeter client received: " + response.message)
if __name__ == ‘__main__‘:
run()