grpc python stream_grpc| python 实战 grpc【h】
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】相关推荐
- grpc环境配置 python_grpc| python 实战 grpc【h】
title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 ...
- grpc实例之Python实现
grpc实例之Python实现 grpc实例之C++实现 grpc详解和安装 本此实例的目的就是客户端给服务端传递三个参数, string, int32, double三种类型, 在从服务端读取到上面 ...
- 【Python进阶学习】gRPC在Python的异步非阻塞实现方式
gRPC在Python的异步非阻塞实现方式 前言 问题&分析 问题阐述 原因分析 解决方案 服务端 原服务端实现方式 aio的服务端实现方式: 客户端 异步非阻塞方式 同步阻塞方式 性能优化效 ...
- python运维实战--跨堡垒机连接二级服务器上传文件
python运维实战--跨堡垒机连接二级服务器上传文件 paramiko的有关概念和操作 Welcome to Paramiko! - Paramiko documentation 这个python脚 ...
- python硬件编程_Python学习日记_《Python硬件编程实战》笔记_Mr_Ouyang
书名: Python硬件编程实战 作者: 李茂 出版社: 机械工业出版社 [此处需要插入图片 Python封面] 笔者简评:不太适宜购买,全书大篇幅在用图片来解释极简单的细节,对于那些需要作者去深挖. ...
- 可转债交易薅羊毛策略 — Python 量化投资实战教程(10)
往期推荐 量化投资原来这么简单(1) 量化投资原来这么简单(2)-MACD策略(+26.9%) 量化投资原来这么简单(3) -A股回测MACD策略 Python 量化投资原来这么简单(4) -KDJ ...
- 4. Python脚本学习实战笔记四 新闻聚合
4. Python脚本学习实战笔记四 新闻聚合 本篇名言:"人言纷杂,保持自我:工作勤奋,娱乐适度:对待朋友,不玩心术:处理事务,不躁不怒:生活讲究,量入为出:知足常乐,一生幸福!" ...
- Python 网络爬虫实战:猫眼电影 38950 条评论数据告诉你《无名之辈》是否值得一看?
11月16日,一部无流量明星.无大制作.无大IP的"三无"国产电影<无名之辈>上映后,竟然连续打败了超级英雄"毒液".会魔法的"神奇动物& ...
- Python 网络爬虫实战:去哪儿网旅游攻略图文爬取保存为 Markdown电子书
接上回,<Python 网络爬虫实战:爬取<去哪儿>网数千篇旅游攻略数据>. 我们爬取到了数千篇的旅游攻略文章的数据. 但是事情还没有结束,对于大部分的人来讲,最希望得到的东西 ...
最新文章
- 同花顺的数据格式总览(转帖)
- 文本文件 java_简单的用java实现读/写文本文件的示例
- java solr 查询条件_05 java调用solr的api完成数据的查询
- 如何使用lazyCSRF在Burp Suite上生成强大的CSRF PoC
- JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包
- 算术基本定理(维基百科)
- DW 在onload运行recordset find.html时 发生了以下javascript错误
- ansbile--playbook剧本案例
- Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
- android屏幕录制鸿洋,Android之自定义View笔记(鸿洋)
- # XAMPP 配置密码大全修改默认密码
- 计算机不支持此接口,Windows10提示不支持此接口的解决方法
- 一个很酷的快速开发代码生成器系统
- visio画图-去掉visio中多余的连接点
- JDK1.8下载安装(Windows版)
- Google广告数据分析与优化总结
- 如何将HL7转换为XML
- 解决:java.sql.SQLException: The server time zone value xxxxx is unrecognized or represents more tha
- stm32f103c8t6使用LORA传输数据
- 100 位测试工程师的 2018 年度关键词与 2019 展望
热门文章
- c语言数字分解一个数,关于一道分解整数为N个连数整数的编程题
- instanceof java_Java中的instanceof关键字
- 一台mysql数据库服务器_在一台服务器安装多个MySQL数据库
- USTB自习教室查询系统-项目计划书-第二部分
- 修改官方发行openstack镜像的cloud-init登录方式为账号密码登录
- (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
- Java基础之写文件——通过缓冲流写文件(StreamOutputToFile)
- ArcIMS9.2新增地图服务时check your map file's layers and data source connections解决
- C++调用 Json解析与处理库
- OpenGL与EGL最简流程(十八)