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中map和列表推导效率比较实例分析
Jun 17 Python
python基础知识小结之集合
Nov 25 Python
利用Python如何生成hash值示例详解
Dec 20 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Python FtpLib模块应用操作详解
Dec 12 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 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
网站上面有这种切换效果
2006/06/26 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
详谈Node.js之操作文件系统
2017/08/29 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python模块学习 filecmp 文件比较
2012/08/27 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
网络信息管理员岗位职责
2014/01/05 职场文书
机关财务管理制度
2014/01/17 职场文书
服装采购员岗位职责
2014/03/15 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
实习介绍信模板
2015/01/30 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
培养联系人考察意见
2015/06/01 职场文书
公司与个人合作协议书
2016/03/19 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang