Protocol buffers--python 实践(一) 简介以及安装与使用
由于最近对grpc产生了浓厚的兴趣,但是那是一整套东西,看了一下用到的东西不少,所以抽丝剥茧先写写这几天调研的protocol buffer -python的收获。
简介:
以下引用自官方首页文档:
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
Protocol Buffers以下简称pb,是google开发的一个可以序列化 反序列化object的数据交换格式,类似于xml,但是比xml 更轻,更快,更简单。而且以上的重点突出一个跨平台,和xml json等数据序列化一样,跨平台跨语言。
现在pb正处在换代的时期,google 2016年7月28日证实发布了version3.0正式宣布从2.x以及3.x 各种alpha-beta版本跨越至正式版。相关文档还在积极跟进中。从pb的官方网站可以看到,已经有pb3的language guide了,而且相关tutorials的各主要语言的实现也在积极跟进之中。 就是因为这点,3.x文档还不够完善,所以现在还是在学习和使用2.x。不过2.x的python版本实现似乎并不是特别好,经过测试比json慢很多,但是有办法可以解决这个问题,后面会提到。
安装:
1. 前往github:https://github.com/google/protobuf/releases 下载最新版本的对应语言的pb,比如这里我是python 所以我会下载。
protobuf-python-3.1.0.zip
2. 下载完毕之后运行包中自带config文件。
3. make&&make install。
4. 之后便可以使用命令 protoc --version 查看安装完毕的版本号。
(grpc)piperck➜ python ᐅ protoc --version
libprotoc 3.0.0
这里可以继续安装c++ 实现 for python 可以提升序列化和反序列化的性能。
5. 进入python文件夹
6. Build and run the tests
python setup.py build
python setup.py test
7. 安装
python setup.py install --cpp_implementation
使用c++ for python的实现要比pure python 实现快10倍左右。是非常大的性能差距。
另外安装方面也可以直接安装grpc:
pip install grpcio
pip install grpcio-tools
然后会安装pb依赖,grpc_tools.protoc工具就是protocol buffer.
使用:
归根到底,pb还是一个序列化反序列化工具,那么使用上来说其实我个人认为是没有json那么简单的,但是却可以保证即使是在python这种动态语言中,数据类型也不会出现错误。他的使用需要定义一个.proto文件,该文件里面会定义号数据类型和格式。我在这里就不再搬运各语言对应的字段,因为这些官方文档中都写的非常清楚。这里直接上最简单的使用。
首先在say_hi.proto文件中定义一个需要在代码中传递的数据结构:
syntax = "proto2"; package hello_word; message SayHi {
required int32 id = ;
required string something = ;
optional string extra_info = ;
}
然后使用命令
protoc -I . --python_out=. hello_world.say_hi.proto
在当前路径下面生成一个say_hi_pb2.py文件。
-I 是指定.proto文件所在路径。
--python_out 输出生成好的pb2.py文件所在路径。
后面参数指定使用哪个.proto文件。
之后我们就可以愉快的使用这个生成好的文件的类进行数据序列化反序列化了。使用例子如下:
# coding: utf-8
import say_hi_pb2 po = say_hi_pb2.SayHi()
po.id = 123
po.something = 'do_something'
po.extra_info = 'xiba' bilibili = po.SerializeToString() oo = say_hi_pb2.SayHi()
oo.ParseFromString(bilibili)
print oo.id
print oo.something
print oo.extra_info
输出:
123
do_something
xiba
以上。
Reference:
https://developers.google.com/protocol-buffers/ protocol-buffers offcial doc
http://blog.csdn.net/handsomekang/article/details/17484139 飘逸的python - 使用protocal buffers
Protocol buffers--python 实践(一) 简介以及安装与使用的更多相关文章
- 【python】-- MySQL简介、安装、操作
MySQL简介.安装.操作 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储 ...
- python paramiko模块简介及安装
一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...
- python框架Django简介与安装
Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...
- Centos 6.8 安装 Protocol Buffers , v3.2.0有 BUG ,安装 3.1.0
Centos 6.8 安装 Protocol Buffers , v3.2.0有 BUG ,安装 3.1.0 切换到用户目录 cd ~ 安装 python2.7,须加入zlib wget http ...
- Protocol Buffers学习笔记
Protocol Buffers学习笔记 1. 简介 Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台.与其他的数据交换格式有所不同,Protocol Bu ...
- Protocol buffers--python 实践 简介以及安装与使用
简介: Protocol Buffers以下简称pb,是google开发的一个可以序列化 反序列化object的数据交换格式,类似于xml,但是比xml 更轻,更快,更简单.而且以上的重点突出一个跨平 ...
- Google Protocol Buffers简介
什么是 protocol buffers ? Protocol buffers 是一种灵活.高效的序列化结构数据的自动机制--想想XML,但是它更小,更快,更简单.你只需要把你需要怎样结构化你的数据定 ...
- protobuf Protocol Buffers 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 在centos 6.9下Protocol Buffers数据传输及存储协议的使用(python)
我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...
随机推荐
- 谷歌浏览器web开发教程之开始篇:使用sublime
你的代码编辑器是主要的开发工具:你使用它去编辑和保存代码段.你可以通过学习编辑器快捷键和以及安装关键插件来好而快的写出代码. 目录 安装sublime文本编辑器 为什么使用包管理器? 安装插件 摘要 ...
- Ckeditor配置
配置参考文档,主要将ckeditor中的(adapters.images.lang.plugins.skins.themes.ckeditor.js.config.js.contents.css)解压 ...
- jsp 页面取值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- no ia32-libs
sudo apt-get install lib32stdc++6 sudo apt-get install lib32z1 http://blog.csdn.net/wangbin_jxust/ar ...
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named '__frch_lableId_0' in 'class com.cd.entity.Page'
#号改为$即可
- zf-分页后台代码
java : public ResultPage getDeptList(int page, int pageRows) throws Exception { String hql="fro ...
- wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选
在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...
- sql trim()函数去掉两头空格
1.sql trim()函数去掉两头空格 sql语法中没有直接去除两头空格的函数,但有ltrim()去除左空格rtrim()去除右空格. 合起来用就是sql的trim()函数,即select ltri ...
- Lucene + Hadoop 分布式搜索运行框架 Nut 1.0a9转自http://www.linuxidc.com/Linux/2012-02/53113.htm
1.概述 不管程序性能有多高,机器处理能力有多强,都会有其极限.能够快速方便的横向与纵向扩展是Nut设计最重要的原则,以此原则形成以分布式并行计算为核心的架构设计.以分布式并行计算为核心的架构设计是N ...
- Mysql limit性能优化(小offset与大offset)
MySQL的优化是非常重要的.其他最常用也最需要优化的就是limit.MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降. 同样是取10条数据 selec ...