在python3中使用google的protobuf以及gRPC

下載源代碼:地址

安裝proto

#下載:protoc-3.9.1-linux-x86_64.zip
unzip protoc-3.9.1-linux-x86_64.zip -d protoc-3.9.1-linux-x86_64 # 解壓
mv protoc-3.9.1-linux-x86_64 /usr/local/protoc # 移動
ln -s /usr/local/protoc/bin/protoc /usr/bin/protoc # 建立軟連接
protoc --version # 測試

安裝python的protof 擴(kuò)展

protoc-3.9.1-linux-x86_64.zip 3 下載
unzip protobuf-python-3.9.1.zip
cd protobuf-3.9.1/python
python3 setup.py build 
python3 setup.py test 
python3 setup.py install
pip list # 參考protobuf         3.9.1

定義數(shù)據(jù)類型

syntax = "proto3";

package  tutorial;

message searchRequest {
    string query = 1;
    int32 page_number = 2;
    int32 result_per_page = 3;
    enum Corpus {
        UNIVERSAL = 0;
        WEB = 1;
        IMAGES =2;
        LOCAL = 3;
        NEWS = 4;
        PRODUCTS = 5;
        VIDEO = 6;
    }

    Corpus corpus = 4;
}

message Person {

    string name = 1;

    int32 id = 2;

    string email = 3;

    enum PhoneType {

        HOME = 0;

        MOBILE = 1;

        WORK = 2;
    }

    message PhoneNumber {

        string number = 1;

        PhoneType type = 2;
    }

    repeated PhoneNumber phones = 4;
}

message AddressBook {

    repeated Person people = 1;
}

protoc --python_out=./ ./test.proto # 編譯文件

測試案例

from google.protobuf import json_format

from scrapy_crawl.deal.service.proto.test_pb2 import *

person = Person()

person.id = 1
person.name = 'vic'
person.email = '3264245@qq.com'
person.phones.add(number='15901780', type=Person.MOBILE)

print(person.SerializeToString())

person1 = Person()
p1 = person1.ParseFromString(person.SerializeToString())
print(p1)

j1 = json_format.MessageToDict(person1, True)
print(j1)

person2 = Person()
json_format.Parse(json_format.MessageToJson(person1, True), person2)
print(person2)
# 下面是執(zhí)行結(jié)果
b'\n\x03vic\x10\x01\x1a\x0e3264245@qq.com"\x0c\n\x0815901780\x10\x01'
37
{'name': 'vic', 'id': 1, 'email': '3264245@qq.com', 'phones': [{'number': '15901780', 'type': 'MOBILE'}]}
name: "vic"
id: 1
email: "3264245@qq.com"
phones {
  number: "15901780"
  type: MOBILE
}

grpc服務(wù)

定義test.proto

syntax = "proto3";

package  helloworld;


message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}

    rpc SayHelloAgain(HelloRequest) returns (HelloReply) {}
}

生產(chǎn)gRPC代碼
python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. helloworld.proto

創(chuàng)建server

import time
from concurrent import futures

from scrapy_crawl.deal.service.proto.test_pb2 import *
from scrapy_crawl.deal.service.proto.test_pb2_grpc import *


class Greeter(GreeterServicer):
    def SayHello(self, request, context):
        return HelloReply(message='hello world, %s' % request.name)

    def SayHelloAgain(self, request, context):
        return HelloReply(message='hello world, %s' % request.name)


def main():
    print("------")
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port("[::]:50051")
    server.start()

    try:
        while True:
            time.sleep(100)
    except KeyboardInterrupt:
        print("stop")
        server.stop(0)
main()

創(chuàng)建client


from scrapy_crawl.deal.service.proto.test_pb2_grpc import *


def run():
    channel = grpc.insecure_channel("localhost:50051")
    stub = GreeterStub(channel=channel)
    r = stub.SayHello(HelloRequest(name='vic'))
    print("greeter client received:%s" % r.message)

    r = stub.SayHelloAgain(HelloRequest(name='baby'))
    print("Greeter client received: %s" % r.message)


run()

錯誤

  1. test_pb2_grpc 引入了test_pb2文件,是絕對路徑引入的导街,修改為先對路徑即可
參考文檔:參考1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻蛇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朝蜘,更是在濱河造成了極大的恐慌恶迈,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暇仲,居然都是意外死亡步做,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門奈附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來全度,“玉大人,你說我怎么就攤上這事斥滤〗遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵佑颇,是天一觀的道長顶掉。 經(jīng)常有香客問我,道長挑胸,這世上最難降的妖魔是什么痒筒? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茬贵,結(jié)果婚禮上簿透,老公的妹妹穿的比我還像新娘。我一直安慰自己解藻,他們只是感情好老充,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舆逃,像睡著了一般蚂维。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上路狮,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天虫啥,我揣著相機(jī)與錄音,去河邊找鬼奄妨。 笑死涂籽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砸抛。 我是一名探鬼主播评雌,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼直焙!你這毒婦竟也來了景东?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤奔誓,失蹤者是張志新(化名)和其女友劉穎斤吐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡和措,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年庄呈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片派阱。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诬留,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贫母,到底是詐尸還是另有隱情文兑,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布颁独,位于F島的核電站彩届,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誓酒。R本人自食惡果不足惜樟蠕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠柑。 院中可真熱鬧寨辩,春花似錦、人聲如沸歼冰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隔嫡。三九已至甸怕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腮恩,已是汗流浹背梢杭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秸滴,地道東北人武契。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像荡含,于是被迫代替她去往敵國和親咒唆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容