由於最近對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 = 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