Python使用gRPC传输协议教程


Posted in Python onOctober 16, 2018

gRPC 简介:

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

安装:

gRPC 的安装:

$ pip install grpcio

安装 ProtoBuf 相关的 python 依赖库:

$ pip install protobuf

安装 python grpc 的 protobuf 编译工具:

$ pip install grpcio-tools

GRPC使用案例

下看一下项目目录结构

Python使用gRPC传输协议教程

grpc是一套传输协议,我们需要在底层实现这套传输协议.当然这些工作都已经被做完了,所以我们只要学会使用一个具有grpc传输协议的服务器和在客户端上调用grpc传输协议传输数据就可以了.

grpc传输协议传输的数据类型为protobuf数据.所以grpc都是和protobuf一块使用.

(1)新建data.proto文件,定义传输的数据格式和grpc服务要实现的函数

syntax = "proto3";
package example;
service FormatData {  //定义服务,用在rpc传输中
 rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {
 string text = 1;
}
message actionresponse{
 string text=1;
}

(2)生成proto数据的python调用格式和grpc服务接口

在proto文件目录下 调用下列命令

$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto

会生成:data_pb2.py 与 data_pb2_grpc.py, 其中data_pb2.py是数据格式调用的文件,data_pb2_grpc.py是grpc传输协议接口调用的文件.

(3)创建实现了grpc传输协议的服务器端

在服务器端代码中需要实现proto文件中编写的服务接口,并重写处理函数,将重写后的服务类实例化以后添加到grpc服务器中,这样创建的grpc服务器就可以实现自定义的proto传输服务了.

# 实现了 server 端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'
# 实现一个派生类,重写rpc中的接口函数.自动生成的grpc文件中比proto中的服务名称多了一个Servicer
class FormatData(data_pb2_grpc.FormatDataServicer):
  # 重写接口函数.输入和输出都是proto中定义的Data类型
  def DoFormat(self, request, context):
    str = request.text
    return data_pb2.actionresponse(text=str.upper()) # 返回一个类实例
def serve():
  # 定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念
  grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))  # 创建一个服务器
  data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer) # 在服务器中添加派生的接口服务(自己实现了处理函数)
  grpcServer.add_insecure_port(_HOST + ':' + _PORT)  # 添加监听端口
  grpcServer.start()  # 启动服务器
  try:
    while True:
      time.sleep(_ONE_DAY_IN_SECONDS)
  except KeyboardInterrupt:
    grpcServer.stop(0) # 关闭服务器
if __name__ == '__main__':
  serve()

(4)创建实现能识别proto数据类和实现grpc传输协议.

# 实现了客户端用于发送数据并打印接收到 server 端处理后的数据
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc
_HOST = 'localhost'
_PORT = '8080'
def run():
  conn = grpc.insecure_channel(_HOST + ':' + _PORT) # 监听频道
  print(conn)
  client = data_pb2_grpc.FormatDataStub(channel=conn)  # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
  print(client)
  response = client.DoFormat(data_pb2.actionrequest(text='hello,world!'))  # 返回的结果就是proto中定义的类
  print("received: " + response.text)
if __name__ == '__main__':
  run()

客户端链接的主机号和端口号,必须是服务器创建的主机号和端口号.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
用Python编程实现语音控制电脑
Apr 01 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
python实现逆波兰计算表达式实例详解
May 06 Python
Python列表删除的三种方法代码分享
Oct 31 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python 编码规范整理
May 05 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
python使用epoll实现服务端的方法
Oct 16 #Python
Python 访问限制 private public的详细介绍
Oct 16 #Python
对django中render()与render_to_response()的区别详解
Oct 16 #Python
浅谈django的render函数的参数问题
Oct 16 #Python
django之跨表查询及添加记录的示例代码
Oct 16 #Python
python看某个模块的版本方法
Oct 16 #Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 #Python
You might like
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
简洁的十分钟Python入门教程
2015/04/03 Python
Python实现配置文件备份的方法
2015/07/30 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
python 日志增量抓取实现方法
2018/04/28 Python
python计算日期之间的放假日期
2018/06/05 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
保护动物的标语
2014/06/11 职场文书
责任书范本
2014/08/25 职场文书
辞职离别感言
2015/08/04 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript