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 数据结构之堆栈实例代码
Jan 22 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
python列表推导式操作解析
Nov 26 Python
pytorch 修改预训练model实例
Jan 18 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
新手学python应该下哪个版本
Jun 11 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
Python如何操作docker redis过程解析
Aug 10 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
Django程序的优化技巧
Apr 29 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生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
五段实用的js高级技巧
2011/12/20 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
php跨域调用json的例子
2013/11/13 Javascript
js Date概念详细介绍
2013/11/22 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
babel基本使用详解
2017/02/17 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
python实现将汉字保存成文本的方法
2018/11/16 Python
Python3几个常见问题的处理方法
2019/02/26 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
浅析Python 序列化与反序列化
2020/08/05 Python
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
医学专业大学生求职的自我评价
2013/11/27 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
办公室管理规章制度
2015/08/04 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis