title: grpc| python 实战 grpc

description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry.

之前用 swoole 写 server 时就接触过 protobuf, 本来以为基于 protobuf 的 grpc, 上手起来会轻轻松松, 没想到结结实实的折腾了许久, 从 php 开始配置 grpc 需要的环境, 到无奈转到 grpc 最亲和 的 go 语言, 又无奈面对各种 go get 撞墙, 直到现在使用 python 语言, 终于 丝般顺滑 的跑完了官网 demo. 代码运行起来后, 之前 grpc 中不太理解的概念, 终于可以 会心一笑 了.

grpc 的基础: protobuf

grpc helloworld: python 实战 grpc 环境配置

grpc basic: grpc 4 种通信方式

grpc 的基础: protobuf

grpc 使用 protobuf 进行数据传输. protobuf 是一种数据交换格式, 由三部分组成:

proto 文件: 使用的 proto 语法的文本文件, 用来定义数据格式

proto语法现在有 proto2 和 proto3 两个版本, 推荐使用 proto3, 更加简洁明了

protoc: protobuf 编译器(compile), 将 proto 文件编译成不同语言的实现, 这样不同语言中的数据就可以和 protobuf 格式的数据进行交互

protobuf 运行时(runtime): protobuf 运行时所需要的库, 和 protoc 编译生成的代码进行交互

使用 protobuf 的过程:

编写 proto 文件 -> 使用 protoc 编译 -> 添加 protobuf 运行时 -> 项目中集成

更新 protobuf 的过程:

修改 proto 文件 -> 使用 protoc 重新编译 -> 项目中修改集成的地方

PS: proto3 的语法非常非常的简单, 上手 protobuf 也很轻松, 反而是配置 protoc 的环境容易卡住, 所以推荐使用 python 入门, 配置 protoc 这一步非常省心.

grpc helloworld: python 实战 grpc 环境配置

上面已经定义好了 grpc helloworld demo 所需的 proto 文件, 现在来具体看看 python 怎么一步步把 grpc helloworld 的环境搭建起来:

protobuf 运行时(runtime)

这一步很简单, 安装 grpc 相关的 python 模块(module) 即可

使用 protoc 编译 proto 文件, 生成 python 语言的实现

编译后生成的代码:

helloworld_pb2.py: 用来和 protobuf 数据进行交互

helloworld_pb2_grpc.py: 用来和 grpc 进行交互

最后一步, 编写 helloworld 的 grpc 实现:

服务器端: helloworld_grpc_server.py

客户端: helloworld_grpc_client.py

运行 python helloworld_grpc_server.py 和 python helloworld_grpc_client.py, 就可以看到效果了

grpc basic: 4 种通信方式

helloworld 使用了最简单的 grpc 通信方式: 类似 http 协议的一次 request+response.

根据不同的业务场景, grpc 支持 4 种通信方式:

客服端一次请求, 服务器一次应答

客服端一次请求, 服务器多次应答(流式)

客服端多次请求(流式), 服务器一次应答

客服端多次请求(流式), 服务器多次应答(流式)

官方提供了一个 route guide service 的 demo, 应用到了这 4 种通信方式, 具体的业务如下:

数据源: json 格式的数据源, 存储了很多地点, 每个地点由经纬度(point)和地名(location)组成

通信方式 1: 客户端请求一个地点是否在数据源中

通信方式 2: 客户端指定一个矩形范围(矩形的对角点坐标), 服务器返回这个范围内的地点信息

通信方式 3: 客户端给服务器发送多个地点信息, 服务器返回汇总信息(summary)

通信方式 4: 客户端和服务器使用地点信息 聊天(chat)

对应的 proto 文件: routeguide.proto:

proto 中想要表示流式传输, 只需要添加 stream 关键字即可

同样的, 使用 protoc 生成代码:

生成了 routeguide_pb2.py routeguide_pb2_grpc.py 文件, 和上面的 helloworld 对应

这里需要增加一个 routeguide_db.py, 用来处理 demo 中数据源(routeguide_db.json)文件:

处理 json 的过程很简单, 解析 json 数据得到由坐标点组成的数组

好了, 还剩下一个难题: 怎么处理流式数据呢?. 答案是 for-in + yield

客户端读取服务器发送的流式数据

客户端发送流式数据给服务器

完整的服务器端代码: routeguide_grpc_server.py:

grpc python stream_grpc| python 实战 grpc【h】相关推荐

  1. grpc环境配置 python_grpc| python 实战 grpc【h】

    title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 ...

  2. grpc实例之Python实现

    grpc实例之Python实现 grpc实例之C++实现 grpc详解和安装 本此实例的目的就是客户端给服务端传递三个参数, string, int32, double三种类型, 在从服务端读取到上面 ...

  3. 【Python进阶学习】gRPC在Python的异步非阻塞实现方式

    gRPC在Python的异步非阻塞实现方式 前言 问题&分析 问题阐述 原因分析 解决方案 服务端 原服务端实现方式 aio的服务端实现方式: 客户端 异步非阻塞方式 同步阻塞方式 性能优化效 ...

  4. python运维实战--跨堡垒机连接二级服务器上传文件

    python运维实战--跨堡垒机连接二级服务器上传文件 paramiko的有关概念和操作 Welcome to Paramiko! - Paramiko documentation 这个python脚 ...

  5. python硬件编程_Python学习日记_《Python硬件编程实战》笔记_Mr_Ouyang

    书名: Python硬件编程实战 作者: 李茂 出版社: 机械工业出版社 [此处需要插入图片 Python封面] 笔者简评:不太适宜购买,全书大篇幅在用图片来解释极简单的细节,对于那些需要作者去深挖. ...

  6. 可转债交易薅羊毛策略 — Python 量化投资实战教程(10)

    往期推荐 量化投资原来这么简单(1) 量化投资原来这么简单(2)-MACD策略(+26.9%) 量化投资原来这么简单(3) -A股回测MACD策略 Python 量化投资原来这么简单(4) -KDJ ...

  7. 4. Python脚本学习实战笔记四 新闻聚合

    4. Python脚本学习实战笔记四 新闻聚合 本篇名言:"人言纷杂,保持自我:工作勤奋,娱乐适度:对待朋友,不玩心术:处理事务,不躁不怒:生活讲究,量入为出:知足常乐,一生幸福!" ...

  8. Python 网络爬虫实战:猫眼电影 38950 条评论数据告诉你《无名之辈》是否值得一看?

    11月16日,一部无流量明星.无大制作.无大IP的"三无"国产电影<无名之辈>上映后,竟然连续打败了超级英雄"毒液".会魔法的"神奇动物& ...

  9. Python 网络爬虫实战:去哪儿网旅游攻略图文爬取保存为 Markdown电子书

    接上回,<Python 网络爬虫实战:爬取<去哪儿>网数千篇旅游攻略数据>. 我们爬取到了数千篇的旅游攻略文章的数据. 但是事情还没有结束,对于大部分的人来讲,最希望得到的东西 ...

最新文章

  1. 同花顺的数据格式总览(转帖)
  2. 文本文件 java_简单的用java实现读/写文本文件的示例
  3. java solr 查询条件_05 java调用solr的api完成数据的查询
  4. 如何使用lazyCSRF在Burp Suite上生成强大的CSRF PoC
  5. JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包
  6. 算术基本定理(维基百科)
  7. DW 在onload运行recordset find.html时 发生了以下javascript错误
  8. ansbile--playbook剧本案例
  9. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
  10. android屏幕录制鸿洋,Android之自定义View笔记(鸿洋)
  11. # XAMPP 配置密码大全修改默认密码
  12. 计算机不支持此接口,Windows10提示不支持此接口的解决方法
  13. 一个很酷的快速开发代码生成器系统
  14. visio画图-去掉visio中多余的连接点
  15. JDK1.8下载安装(Windows版)
  16. Google广告数据分析与优化总结
  17. 如何将HL7转换为XML
  18. 解决:java.sql.SQLException: The server time zone value xxxxx is unrecognized or represents more tha
  19. stm32f103c8t6使用LORA传输数据
  20. 100 位测试工程师的 2018 年度关键词与 2019 展望

热门文章

  1. c语言数字分解一个数,关于一道分解整数为N个连数整数的编程题
  2. instanceof java_Java中的instanceof关键字
  3. 一台mysql数据库服务器_在一台服务器安装多个MySQL数据库
  4. USTB自习教室查询系统-项目计划书-第二部分
  5. 修改官方发行openstack镜像的cloud-init登录方式为账号密码登录
  6. (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
  7. Java基础之写文件——通过缓冲流写文件(StreamOutputToFile)
  8. ArcIMS9.2新增地图服务时check your map file's layers and data source connections解决
  9. C++调用 Json解析与处理库
  10. OpenGL与EGL最简流程(十八)