Protocol Buffer的python實踐

Protocol Buffer  實踐(一) 簡介以及安裝與使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章