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下singleton模式的实现方法
Jul 16 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Django+Celery实现定时任务的示例
Jun 23 Python
在python中读取和写入CSV文件详情
Jun 28 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
Javascript开发包大全整理
2006/12/22 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
React 高阶组件入门介绍
2018/01/11 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
python中sleep函数用法实例分析
2015/04/29 Python
Python映射拆分操作符用法实例
2015/05/19 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python 异常处理的实例详解
2017/09/11 Python
python实现神经网络感知器算法
2017/12/20 Python
Python温度转换实例分析
2018/01/17 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
彻底解决Python包下载慢问题
2020/11/15 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
初一生物教学反思
2014/01/18 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
中学生家长评语大全
2014/04/16 职场文书
质量安全标语
2014/06/07 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
Redis+AOP+自定义注解实现限流
2022/06/28 Redis