1. 程式人生 > >Python RPC 之 gRPC

Python RPC 之 gRPC

gRPC 簡介:

gRPC 是一款高效能、開源的 RPC 框架,產自 Google,基於 ProtoBuf 序列化協議進行開發,支援多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 使用。因為 gRPC 對 HTTP/2 協議的支援使其在 Android、IOS 等客戶端後端服務的開發領域具有良好的前景。gRPC 提供了一種簡單的方法來定義服務,同時客戶端可以充分利用 HTTP2 stream 的特性,從而有助於節省頻寬、降低 TCP 的連線次數、節省CPU的使用等。

安裝:

  1. gRPC 的安裝:

    $ pip install grpcio

  2. 安裝 ProtoBuf 相關的 python 依賴庫:

    $ pip install protobuf

  3. 安裝 python grpc 的 protobuf 編譯工具:

    $ pip install grpcio-tools

實踐:

下面我們使用 gRPC 定義一個介面,該介面實現對傳入的資料進行大寫的格式化處理。
* 建立專案 python demo 工程:
Paste_Image.png

  1. client目錄下的 main.py 實現了客戶端用於傳送資料並列印接收到 server 端處理後的資料
    1. server 目錄下的 main.py 實現了 server 端用於接收客戶端傳送的資料,並對資料進行大寫處理後返回給客戶端
    2. example 包用於編寫 proto 檔案並生成 data 介面
  • 定義 gRPC 介面:
syntax = "proto3";
package example;
service FormatData {
  rpc DoFormat(Data) returns (Data){}
}
message Data {
  string text = 1;
}
  • 編譯 protobuf:

    $ python -m grpc_tools.protoc -I. –python_out=. –grpc_python_out=. ./data.proto #在 example 目錄中執行編譯,會生成:data_pb2.py 與 data_pb2_grpc.py

  • 實現 server 端:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'

class FormatData(data_pb2_grpc.FormatDataServicer):
    def DoFormat(self, request, context):
        str = request.text
        return data_pb2.Data(text=str.upper())

def serve():
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)
    grpcServer.add_insecure_port(_HOST + ':' + _HOST)
    grpcServer.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        grpcServer.stop(0)

if __name__ == '__main__':
    serve()
  • 實現 client 端:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc

_HOST = 'localhost'
_PORT = '8080'

def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)
    client = data_pb2_grpc.FormatDataStub(channel=conn)
    response = client.DoFormat(data_pb2.Data(text='hello,world!'))
    print("received: " + response.text)

if __name__ == '__main__':
    run()
  • 執行驗證結果:
    1. 先啟動 server,之後再執行 client
      1. client 側控制檯如果列印的結果為:“received: HELLO,WORLD!” ,證明 gRPC 介面定義成功

  • 交流可以加 QQ 群:397234385
  • 或者 QQ 掃碼入群:

qq群.jpg

相關推薦

Python RPC gRPC

gRPC 簡介: gRPC 是一款高效能、開源的 RPC 框架,產自 Google,基於 ProtoBuf 序列化協議進行開發,支援多種語言(Golang、Python、Java等),本篇只介紹

linux 下 rpc python 例項使用XML-RPC進行遠端檔案共享

這是個不錯的練習,使用python開發P2P程式,或許通過這個我們可以自己搞出來一個P2P下載工具,類似於迅雷。說到迅雷,關於其原理不知道大家是否瞭解,如果你不瞭解,我想看完這篇文章,你一定會了解的。啥,你已經瞭解了?那就過來指點一番。 以前在java中也接觸過類似的概念。一個是RMI( Remote Me

rpc框架gRPC 學習

grpc是google在github於2015年開源的一款RPC框架,雖然protobuf很早google就開源了,但是google一直沒推出正式的開源框架,導致github上基於protobuf的rpc五花八門,國內比較著名的有百度的sofa-pbrpc,但是遺憾的是s

python基礎socket編程

ron 模塊 執行 優化 控制 端口號 文件 斷開連接 page 一 客戶端/服務器架構 即C/S架構,包括1.硬件C/S架構(打印機)2.軟件C/S架構(web服務)最常用的軟件服務器是 Web 服務器。一臺機器裏放一些網頁或 Web 應用程序,然後啟動 服務。這樣的服務

python學習路(四)

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

python基礎socket編程-------基於tcp的套接字實現遠程執行命令的操作

logs lose stream res std 遠程控制 python log out 遠程實現cmd功能: import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOC

python框架 Tornado 學習筆記(一)

tornado pythontornado 一個簡單的服務器的例子:首先,我們需要安裝 tornado ,安裝比較簡單: pip install tornado 測試安裝是否成功,可以打開python 終端,輸入: import tornado.https

Python 基礎列表和元組

bcp rtt fcn ott emd lns swe 二維數組 ttf list Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。 比如,列出班裏所有同學的名字,就可以用一個list表示: >>

python學習-項目開發目錄規範

使用說明 可執行 程序說明 一行 python學習 規範 功能性 行程 -m 軟件目錄結構規範有什麽好處:  通過規範化,能夠更好的控制軟件結構,讓程序具有更高的可讀性。項目目錄組織結構如下: Foo/         # 項目名 --bin/     # 可執

Python 基礎 異常處理

判斷 簡單 不讓 tor pen opened 分支結構 子類 inpu python 基礎之異常處理 說到異常處理,就得先問一下,什麽是異常處理? 先來看一下,什麽是異常? 異常就是:程序運行時發出的錯誤的信號。 異常的種類先來看一下: 一、常見的異常

python學習 -- 數據序列化

單獨 get 多次 __main__ print lambda 字典 學習 module json / pickle 數據序列化序列化定義:把變量從內存中變成可存儲或傳輸的過程稱為序列化。反序列化:把變量內容從序列化的對象重新讀到內存裏稱為反序列胡。序列化模塊之--pick

python自動化正則

verbose fin documents cell its pri rbo 大小寫 開始 import re phoneNumRegex=re.compile(r‘\d\d\d-\d\d\d-\d\d\d\d‘) mo=phoneNumRegex.search(‘My n

一個鹹魚的Python爬蟲路(三):爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

python大法二-一些基礎(一)

計算機編程 python 獨立博客 hello 解釋器 個人獨立博客出處:http://www.xbman.cn/出處:http://www.xbman.cn/article/3Python是一種解釋性計算機編程語言。采用縮進式語法,寫起來的感覺有點像排了版的shell,這裏要註意寫pyt

[Python爬蟲] 十五:Selenium +phantomjs根據微信公眾號抓取微信文章

頭部 drive lac 過程 標題 操作 函數 軟件測試 init   借助搜索微信搜索引擎進行抓取   抓取過程   1、首先在搜狗的微信搜索頁面測試一下,這樣能夠讓我們的思路更加清晰        在搜索引擎上使用微信公眾號英文名進行“搜公眾號&r

Python學習__slots__屬性

self. 但是 name obj import print blog 網站 usr 在廖老師的網站上學習的__slots__屬性 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/5/14 1

Python基礎文件操作流與函數

默認 true 格式 nbsp 文件 內容 print 寫入 追加 一.文件操作 打開文件的方式有: r,只讀模式(默認) w,只寫模式(不可讀;不存在則創建;存在則刪除內容;) a,追加模式(可讀; 不存在則創建;存在則只追加內容;) "+"表示可以同時讀寫某個文

python基礎模塊os模塊

os pythonpython基礎之模塊之os模塊os模塊的作用:  os,語義為操作系統,所以肯定就是操作系統相關的功能了,可以處理文件和目錄這些我們日常手動需要做的操作,就比如說:顯示當前目錄下所有文件/刪除某個文件/獲取文件大小……  另外,os模塊不受平臺限制,也就是說:當我們要在linux中顯示當前

python基礎map/reduce/filter/sorted

排序。 strong func iterable 例子 決定 tools sort .com ---map(fun,iterable)   首先來看一看map()函數,map函數接受兩個參數,第一個參數是函數的名稱,第二個參數一個可叠代對象。即map(fun,iterabl

Python學習路 002

else 內容 readline input rjust price info class 信息   今天寫著購物車的作業,最頭疼的是文件操作了 尤其是文件的打開模式  w  r  a  最TM的頭疼 r+模式可讀可寫,但是寫的內容會根據文件指針去覆蓋之前的內容,當文件