真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中g(shù)RPC框架的使用

簡介

gRPC 是一個(gè)高性能、開源和通用的 RPC 框架,面向移動(dòng)和 HTTP/2 設(shè)計(jì)。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。gRPC 基于 HTTP/2 標(biāo)準(zhǔn)設(shè)計(jì),帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復(fù)用請(qǐng)求等特。這些特性使得其在移動(dòng)設(shè)備上表現(xiàn)更好,更省電和節(jié)省空間占用。gRPC 提供了一種簡單的方法來定義服務(wù),同時(shí)客戶端可以充分利用 HTTP/2 stream 的特性,從而有助于節(jié)省帶寬、降低 TCP 的連接次數(shù)、節(jié)省CPU的使用等

10年積累的成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有棗莊免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Python中g(shù)RPC框架的使用

gRPC 默認(rèn)使用 protocol buffers,這是 Google 開源的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化。它很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。

安裝

官方參考文檔

  • gRPC 的安裝:
$ pip install grpcio
  • 安裝 ProtoBuf 相關(guān)的 python 依賴庫:
    $ pip install protobuf
  • 安裝 python grpc 的 protobuf 編譯工具:
    $ pip install grpcio-tools

實(shí)踐

定義一個(gè)消息類型

先來看一個(gè)非常簡單的例子。假設(shè)你想定義一個(gè)“搜索請(qǐng)求”的消息格式,每一個(gè)請(qǐng)求含有一個(gè)查詢字符串、你感興趣的查詢結(jié)果所在的頁數(shù),以及每一頁多少條查詢結(jié)果??梢圆捎萌缦碌姆绞絹矶x消息類型的.proto文件了:

syntax = "proto3";  // 聲明使用 proto3 語法

message SearchRequest {
  string query = 1;  // 每個(gè)字段都要指定數(shù)據(jù)類型
  int32 page_number = 2; // 這里的數(shù)字2 是標(biāo)識(shí)符,最小的標(biāo)識(shí)號(hào)可以從1開始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]
  int32 result_per_page = 3; // 這里是注釋,使用 //
}
  • 文章的第一行指定了你正在使用 proto3 語法:如果不指定,編譯器會(huì)使用 proto2。這個(gè)指定語法必須是文件的非空非注釋的第一行。
  • SearchRequest消息格式有三個(gè)字段,在消息中承載的數(shù)據(jù)分別對(duì)應(yīng)于每一個(gè)字段。其中每個(gè)字段都有一個(gè)名字和一種類型。
  • 向.proto文件添加注釋,可以使用C/C++/java風(fēng)格的雙斜杠(//) 語法格式。
  • 在消息體中,每個(gè)字段都有唯一的一個(gè)數(shù)字標(biāo)識(shí)符。這些標(biāo)識(shí)符用來在消息的二進(jìn)制格式中識(shí)別各個(gè)字段,一旦開始使用就不能再改變。

[1,15]之內(nèi)的標(biāo)識(shí)號(hào)在編碼的時(shí)候會(huì)占用一個(gè)字節(jié)。[16,2047]之內(nèi)的標(biāo)識(shí)號(hào)則占用2個(gè)字節(jié)。所以應(yīng)該為那些頻繁出現(xiàn)的消息元素保留 [1,15]之內(nèi)的標(biāo)識(shí)號(hào)。切記:要為將來有可能添加的、頻繁出現(xiàn)的標(biāo)識(shí)號(hào)預(yù)留一些標(biāo)識(shí)號(hào)。

指定字段規(guī)則

所指定的消息字段修飾符必須是如下之一:

  • singular:一個(gè)格式良好的消息應(yīng)該有0個(gè)或者1個(gè)這種字段(但是不能超過1個(gè))。
  • repeated:在一個(gè)格式良好的消息中,這種字段可以重復(fù)任意多次(包括0次)。重復(fù)的值的順序會(huì)被保留。
    在proto3中,repeated的標(biāo)量域默認(rèn)情況蝦使用packed。
數(shù)值類型

一個(gè)標(biāo)量消息字段可以含有一個(gè)如下的類型——該表格展示了定義于.proto文件中的類型,以及與之對(duì)應(yīng)的、在自動(dòng)生成的訪問類中定義的類型:
Python中g(shù)RPC框架的使用

默認(rèn)值

當(dāng)一個(gè)消息被解析的時(shí)候,如果被編碼的信息不包含一個(gè)特定的singular元素,被解析的對(duì)象鎖對(duì)應(yīng)的域被設(shè)置位一個(gè)默認(rèn)值,對(duì)于不同類型指定如下:

  • 對(duì)于strings,默認(rèn)是一個(gè)空string
  • 對(duì)于bytes,默認(rèn)是一個(gè)空的bytes
  • 對(duì)于bools,默認(rèn)是false
  • 對(duì)于數(shù)值類型,默認(rèn)是0
  • 對(duì)于枚舉,默認(rèn)是第一個(gè)定義的枚舉值,必須為0;
  • 對(duì)于消息類型(message),域沒有被設(shè)置,確切的消息是根據(jù)語言確定的,詳見generated code guide
  • 對(duì)于可重復(fù)域的默認(rèn)值是空(通常情況下是對(duì)應(yīng)語言中空列表)。
嵌套類型

你可以在其他消息類型中定義、使用消息類型,在下面的例子中,Result消息就定義在SearchResponse消息內(nèi),如:

message SearchResponse {
  message Result {
    string url = 1;
    string title = 2;
    repeated string snippets = 3;
  }
  repeated Result results = 1;
}

在 message SearchResponse 中,定義了嵌套消息 Result,并用來定義SearchResponse消息中的results域。

Protobuf 文件編譯

從.proto文件生成了什么?

當(dāng)用protocol buffer編譯器來運(yùn)行.proto文件時(shí),編譯器將生成所選擇語言的代碼,這些代碼可以操作在.proto文件中定義的消息類型,包括獲取、設(shè)置字段值,將消息序列化到一個(gè)輸出流中,以及從一個(gè)輸入流中解析消息。

  • 對(duì)C++來說,編譯器會(huì)為每個(gè).proto文件生成一個(gè).h文件和一個(gè).cc文件,.proto文件中的每一個(gè)消息有一個(gè)對(duì)應(yīng)的類。
  • 對(duì)Java來說,編譯器為每一個(gè)消息類型生成了一個(gè).java文件,以及一個(gè)特殊的Builder類(該類是用來創(chuàng)建消息類接口的)。
  • 對(duì)Python來說,有點(diǎn)不太一樣——Python編譯器為.proto文件中的每個(gè)消息類型生成一個(gè)含有靜態(tài)描述符的模塊,,該模塊與一個(gè)元類(metaclass)在運(yùn)行時(shí)(runtime)被用來創(chuàng)建所需的Python數(shù)據(jù)訪問類。
  • 對(duì)go來說,編譯器會(huì)位每個(gè)消息類型生成了一個(gè).pd.go文件。
  • 對(duì)于Ruby來說,編譯器會(huì)為每個(gè)消息類型生成了一個(gè).rb文件。
  • javaNano來說,編譯器輸出類似域java但是沒有Builder類
  • 對(duì)于Objective-C來說,編譯器會(huì)為每個(gè)消息類型生成了一個(gè)pbobjc.h文件和pbobjcm文件,.proto文件中的每一個(gè)消息有一個(gè)對(duì)應(yīng)的類。
  • 對(duì)于C#來說,編譯器會(huì)為每個(gè)消息類型生成了一個(gè).cs文件,.proto文件中的每一個(gè)消息有一個(gè)對(duì)應(yīng)的類。

Python gRPC 示例

gRPC_DEMO  GitHub源碼

編譯

使用以下命令編譯:

$ python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto

生成了兩個(gè)文件:

  • hello_pb2.py 此文件包含生成的 request(HelloRequest) 和 response(HelloReply) 類。
  • hello_pb2_grpc.py 此文件包含生成的 客戶端(GreeterStub)和服務(wù)端(GreeterServicer)的類。
創(chuàng)建服務(wù)端代碼

創(chuàng)建和運(yùn)行 Greeter 服務(wù)可以分為兩個(gè)部分:

  • 實(shí)現(xiàn)我們服務(wù)定義的生成的服務(wù)接口:做我們的服務(wù)的實(shí)際的“工作”的函數(shù)。

  • 運(yùn)行一個(gè) gRPC 服務(wù)器,監(jiān)聽來自客戶端的請(qǐng)求并傳輸服務(wù)的響應(yīng)。
創(chuàng)建客戶端代碼

見gRPC_DEMO  GitHub源碼

運(yùn)行代碼
  1. 首先運(yùn)行服務(wù)端代碼

    python server/main.py
  2. 然后運(yùn)行客戶端代碼

    python client/main.py
        輸出:
            >>> Greeter client received: Hello, goodspeed!

本文標(biāo)題:Python中g(shù)RPC框架的使用
標(biāo)題路徑:http://weahome.cn/article/gjiohd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部