使用python实现 grpc 通信

  • RPC
    远程过程调用协议RPC(Remote Procedure Call Protocol)。RPC 是指远程过程调用,也就是说两台服务器A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上的应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
  • gRPC
    gPRC是一个高性能、通用的开源RPC框架,基于 RrotoBuf 序列化协议开发。

安装 grpc 库

pip install grpcio grpc-tools protobuf 

实现一个简单 grpc 通信

  • 定义hello_bilibili.proto
syntax = "proto3";
package test;

service Bibili {
	rpc HelloDewei(HelloweiReq) returns (HelloDeweiReply){}
	rpc HelloTest(stream HelloTestRequst) returns (stream HelloTestResponse) {}
}

massage HelloweiReq {
	string name;
	int32 age;
}

massage HelloTestRequest {
	string name = 1;
	int64 age = 2;
	repeated string data = 3;
	message HelloTestRequestNumberValue {
	string name = 1;
	int32 age = 2;
	bool is_active = 3;
	}
	map<string, HelloTestRequestNumberValue> number = 4;
}

massage HelloTestResponse {}

massage HelloDeweiReply {
	string result = 1;
}
  • 定义server
import grpc
import hello_bilibili_pb2 as pb2
import hello_bilibili_pb2_grpc as pb2_grpc

from concurrent import futures

class Bibili(pb2_grpc.BibiliServicer):
	def HelloDewei(self, request, context):
		name = request.name
		age = request.age
		result = f'my name is {name}, i am {age}'
		return pb2.HelloDeweiReply(result=result)
def run():
	grpc_server = grpc.server(
	futures.ThreadPoolExecutor(max_workers=4)
	)
	pb2_grpc.add_BibiliServicer_to_server(Bibili(), grpc_server)
	print("server will start at 0.0.0.0:5000")
	try:
		time.sleep(3600)
	except keyboardInterrupt:
		grpc_server.stop(0)

if __name__=="__main__":
	run()
  • 定义client.py
import grpc
import hello_bilibili_pb2 as pb2
import hello_bilibili_pd2_grpc as pb2_grpc

def run():
	conn = grpc.insecure_channel("0.0.0.0:5000")
	client = pb2_grpc.BibiliStub(channel=conn)
	response = client.HelloDewei(pb2.HelloDeweiReq(
		name="dewei", age=33
	))
	print(response.result)
if __name__=="__main__":
	run()

代码解释

  • _pb2.py 文件介绍
    每一个message对应的信息存储,比如我们的request与response在这里被定义extension
  • _pb2_grpc.py 文件介绍
    用来存储每个服务的server与客户端以及注册server的工具。
    • 客户端:server_name+Stub
    • 服务端:service_name+Servicer
    • 注册服务:add_服务端名_to_server
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python可以使用gRPC实现通信gRPC是一种高性能、开源的远程过程调用(RPC)框架。它使用Protocol Buffers作为接口定义语言(IDL),支持多种编程语言。 要在Python实现gRPC通信,需要进行以下步骤: 1. 定义服务接口:使用Protocol Buffers定义服务接口,包括请求和响应的消息类型以及服务方法。 2. 生成代码:使用Protocol Buffers编译器将定义的.proto文件生成对应的Python代码。 3. 实现服务逻辑:编写服务实现类,继承自生成的代码中的服务基类,并实现定义的服务方法。 4. 启动服务器:创建gRPC服务器,并将实现的服务添加到服务器中。 5. 创建客户端:创建gRPC客户端,通过客户端调用远程服务方法。 下面是一个简单的示例: 1. 定义服务接口(example.proto): ``` syntax = "proto3"; package example; service Greeter { rpc SayHello (HelloRequest) returns (HelloResponse) {} } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 2. 生成代码:使用Protocol Buffers编译器生成Python代码: ``` $ python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. example.proto ``` 3. 实现服务逻辑(server.py): ```python import grpc import example_pb2 import example_pb2_grpc class GreeterServicer(example_pb2_grpc.GreeterServicer): def SayHello(self, request, context): message = f"Hello, {request.name}!" return example_pb2.HelloResponse(message=message) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) example_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve() ``` 4. 启动服务器: ``` $ python server.py ``` 5. 创建客户端(client.py): ```python import grpc import example_pb2 import example_pb2_grpc def run(): channel = grpc.insecure_channel('localhost:50051') stub = example_pb2_grpc.GreeterStub(channel) response = stub.SayHello(example_pb2.HelloRequest(name='Alice')) print("Greeter client received: " + response.message) if __name__ == '__main__': run() ``` 以上是一个简单的Python实现gRPC通信的示例。你可以根据自己的需求定义更复杂的服务接口和实现逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

误伤这又何妨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值