Python RPC 之 gRPC
gRPC 簡介:
gRPC 是一款高效能、開源的 RPC 框架,產自 Google,基於 ProtoBuf 序列化協議進行開發,支援多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 使用。因為 gRPC 對 HTTP/2 協議的支援使其在 Android、IOS 等客戶端後端服務的開發領域具有良好的前景。gRPC 提供了一種簡單的方法來定義服務,同時客戶端可以充分利用 HTTP2 stream 的特性,從而有助於節省頻寬、降低 TCP 的連線次數、節省CPU的使用等。
安裝:
gRPC 的安裝:
$ pip install grpcio
安裝 ProtoBuf 相關的 python 依賴庫:
$ pip install protobuf
安裝 python grpc 的 protobuf 編譯工具:
$ pip install grpcio-tools
實踐:
下面我們使用 gRPC 定義一個介面,該介面實現對傳入的資料進行大寫的格式化處理。
* 建立專案 python demo 工程:
- client目錄下的 main.py 實現了客戶端用於傳送資料並列印接收到 server 端處理後的資料
- server 目錄下的 main.py 實現了 server 端用於接收客戶端傳送的資料,並對資料進行大寫處理後返回給客戶端
- 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()
- 執行驗證結果:
- 先啟動 server,之後再執行 client
- client 側控制檯如果列印的結果為:“received: HELLO,WORLD!” ,證明 gRPC 介面定義成功
- 先啟動 server,之後再執行 client
- 交流可以加 QQ 群:397234385
- 或者 QQ 掃碼入群:
相關推薦
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+模式可讀可寫,但是寫的內容會根據文件指針去覆蓋之前的內容,當文件