因爲最近對grpc產生了濃厚的興趣,可是那是一整套東西,看了一下用到的東西很多,因此抽絲剝繭先寫寫這幾天調研的protocol buffer -python的收穫。python
簡介:c++
如下引用自官方首頁文檔:git
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.github
Protocol Buffers如下簡稱pb,是google開發的一個能夠序列化 反序列化object的數據交換格式,相似於xml,可是比xml 更輕,更快,更簡單。並且以上的重點突出一個跨平臺,和xml json等數據序列化同樣,跨平臺跨語言。web
如今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慢不少,可是有辦法能夠解決這個問題,後面會提到。json
安裝:數據結構
1. 前往github:https://github.com/google/protobuf/releases 下載最新版本的對應語言的pb,好比這裏我是python 因此我會下載。ide
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 = 1; required string something = 2; optional string extra_info = 3; }
而後使用命令
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