栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

grpc+python的说明和应用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

grpc+python的说明和应用

文章目录
  • 引用
  • 实操


引用

关于rpc和grpc这篇文章写得不错:https://zhuanlan.zhihu.com/p/148139089

其中几点注意下即可:
1.rpc即remote procedure call(远程服务调用),所以比如redis-cli和redis-server之间的通讯交互也是rpc。而其有三个特点:

  • 需要事先约定调用的语义(接口语法)
  • 需要网络传输
  • 需要约定网络传输中的内容格式

2.网络传输可以是:http、tcp,所以可以说grpc包含了http,http是其传输的一种形式;也有下述的演进

  • onc rpc ->restful json -> grpc http2.0 protobuf
  • 对于json,其缺点表现为HTTP的header和Json的数据冗余和低压缩率使得传输性能差
  • 对于grpc,不仅本身在空间压缩上有几十倍的提升,同时引入了http2.0大幅度提升了性能

3.grpc是rpc的一个框架,本身基于protobuf的序列化内容格式通讯,网络传输上用了http 2.0,同时对于不同语言的扩展很好
4,grpc的四种通信模式:

  • 一元模式RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。
  • 服务端流模式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
  • 客户端流模式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
  • 双向流模式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。

了解上面这一块,就能基本掌握grpc了,当前各类语言对grpc的支持都不错,在golang这里相对用的比较多,而在python就比较少。
如何基于python搭建grpc,可以参考这篇:https://www.jianshu.com/p/cc218827f127

本质上就三步:
1.先安装关键包:grpcio(负责调用grpc)、grpcio-tools(负责转换protobuf)
2.然后定义protobuf的文本,通过grpcio-tools将其转换为python文件,然后调用该文件的接口,即可对应的实现grpc客户端+服务端
3.根据生成的python文件和grpcio包,实现客户端+服务端

实操

下面实操,先安装:

pip install grpcio grpcio-tools

接着定义protobuf文件,这里定义一个swim.proto的格式,由三部分构成:路由、请求体、返回体,简单来说就是http 前后端交互那一套,具体如下:

syntax = "proto3"; // 版本声明,使用Protocol Buffers v3版本

// 定义路由
service SwimsRoute {
    rpc BeginSwim (BeginSwimRequest) returns (BeginSwimReply) {}
}



// 定义请求体
message BeginSwimRequest {
    int32 id = 1;
    map params = 3;
}

// 定义返回体
message BeginSwimReply {
    string message = 1;
    bool success = 2;
}

然后定义客户端:

import grpc
from swim_pb2 import BeginSwimRequest  # 从生成的文件里导入请求体
from swim_pb2_grpc import SwimsRouteStub

# 服务端地址
channel = grpc.insecure_channel("127.0.0.1:9999")
stub = SwimsRouteStub(channel)
_request = BeginSwimRequest(id=1, params={'t':'g'})  # 假数据
response = stub.BeginSwim(_request)
return response.success

接着定义服务端:

from swim_pb2_grpc import add_SwimsRouteServicer_to_server, SwimsRouteServicer
from swim_pb2 import BeginSwimReply

class SwimService(SwimsRouteServicer):
	def begin_swim(self, request, context):
		id=request.id
		return BeginSwimReply(success=True, message="")

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))  # 定义十个worker
add_SwimsRouteServicer_to_server(SwimService(), server)
server.add_insecure_port("127.0.0.1:9999")
server.start()
server.wait_for_termination()   # 使grpc持久提供服务

最后python server.py启动服务端,python client.py就可以进行通讯

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/588370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号