Python RPC 之 gRPC

Python RPC 之 gRPC

    <!-- 作者区域 -->
    <div class="author">
      <a class="avatar" href="/u/07ec92559a49">
        <img src="//upload.jianshu.io/users/upload_avatars/208550/33b60f8a-b948-4646-b901-4168f4ab5173.jpeg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">


谢烟客






0.8


2017.03.08 20:34*
字数 455
阅读 14249 评论 5 赞赏 1



    <!-- 文章内容 -->
    <div data-note-content="" class="show-content">
      <div class="show-content-free">
        <h1>gRPC 简介:</h1>

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

安装:

  1. gRPC 的安装:

$ pip install grpcio

  1. 安装 ProtoBuf 相关的 python 依赖库:

$ pip install protobuf

  1. 安装 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 + ‘:’ + _PORT)
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
      </div>
    </div>
</div>

<!-- 如果是付费文章,未购买,则显示购买按钮 -->

<!-- 连载目录项 -->

<!-- 如果是付费文章 -->
  <!-- 如果是付费连载,已购买,且作者允许赞赏,则显示付费信息和赞赏 -->
    <div id="free-reward-panel" class="support-author"><p>瞅啥呢?如果不打赏就给点个喜欢呗 ^_^</p> <div class="btn btn-pay">赞赏支持</div> <div class="supporter"><ul class="support-list"><li><a target="_blank" href="/u/760ad7ad09e3" class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/9-cceda3cf5072bcdd77e8ca4f21c40998.jpg"></a></li></ul> <!----></div> <!----> <!----></div>

  <div class="show-foot">
    <a class="notebook" href="/nb/1051070">
      <i class="iconfont ic-search-notebook"></i>
      <span>1024块</span>



  <!-- 文章底部作者信息 -->
    <div class="follow-detail">
      <div class="info">
        <a class="avatar" href="/u/07ec92559a49">
          <img src="//upload.jianshu.io/users/upload_avatars/208550/33b60f8a-b948-4646-b901-4168f4ab5173.jpeg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">


谢烟客

写了 20226 字,被 310 人关注,获得了 256 个喜欢


职业打杂儿,业余编程。。。

<div class="meta-bottom">
  <div data-v-6ddd02c6="" class="like"><div data-v-6ddd02c6="" class="btn like-group"><div data-v-6ddd02c6="" class="btn-like"><a data-v-6ddd02c6="">喜欢</a></div> <div data-v-6ddd02c6="" class="modal-wrap"><a data-v-6ddd02c6="">17</a></div></div> <!----></div>
  <div class="share-group">
    <a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
      <i class="iconfont ic-wechat"></i>
    </a>
    <a class="share-circle" data-action="weibo-share" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&amp;url=',e(u),'&amp;title=',e(t||d.title),'&amp;source=',e(r),'&amp;sourceUrl=',e(l),'&amp;content=',c||'gb2312','&amp;pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','', '推荐 谢烟客 的文章《Python RPC 之 gRPC》( 分享自 @简书 )','https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));" data-original-title="分享到微博">
      <i class="iconfont ic-weibo"></i>
    </a>
    <a class="share-circle" data-toggle="tooltip" id="longshare" target="_blank" data-original-title="" title="">
        <div class="qrcode" id="qrcode">
         <img src="//cdn2.jianshu.io/assets/web/download-index-side-qrcode-cb13fc9106a478795f8d10f9f632fccf.png" alt="Download index side qrcode">
         <p>下载app生成长微博图片</p>
         </div>
      <i class="iconfont ic-picture"></i>
    </a>
    <a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
      <ul class=&quot;share-list&quot;>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone')+'&amp;title='+e('推荐 谢烟客 的文章《Python RPC 之 gRPC》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-zone&quot;></i><span>分享到QQ空间</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter')+'&amp;text='+e('推荐 谢烟客 的文章《Python RPC 之 gRPC》( 分享自 @jianshucom )')+'&amp;related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-twitter&quot;></i><span>分享到Twitter</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-facebook&quot;></i><span>分享到Facebook</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;><i class=&quot;social-icon-sprite social-icon-google&quot;></i><span>分享到Google+</span></a></li>
        <li><a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('https://www.jianshu.com/p/14e6f5217f40?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban')+'&amp;title='+e('Python RPC 之 gRPC')+'&amp;sel='+e(s)+'&amp;v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&amp;r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;><i class=&quot;social-icon-sprite social-icon-douban&quot;></i><span>分享到豆瓣</span></a></li>
      </ul>
    " data-original-title="" title="">更多分享</a>
  </div>
</div>

  <a id="web-note-ad-1" target="_blank" href="/apps/redirect?utm_source=note-bottom-click"><img src="//cdn2.jianshu.io/assets/web/web-note-ad-1-c2e1746859dbf03abe49248893c9bea4.png" alt="Web note ad 1"></a>

<!--
<div id="note-comment-above-ad-container">
  <span id="youdao-comment-ad" class="ad-badge">广告</span>
</div>
-->
<div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/avatar_default-78d4d1f68984cd6d4379508dd94b4210.png"></a> <div class="sign-container"><a href="/sign_in?utm_source=desktop&amp;utm_medium=not-signed-in-comment-form" class="btn btn-sign">登录</a> <span>后发表评论</span></div></form> <!----></div> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="normal-comment-list" class="normal-comment-list"><div><div><div class="top-title"><span>5条评论</span> <a class="author-only">只看作者</a> <a class="close-btn" style="display: none;">关闭评论</a> <div class="pull-right"><a class="active">按时间倒序</a><a class="">按时间正序</a></div></div></div> <!----> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="comment-39635997" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/4848ad9440b8" target="_blank" class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/4-3397163ecdb3855a0a4139c34a695885.jpg"></a>  </div> <!----></div> <div class="info"><a href="/u/4848ad9440b8" target="_blank" class="name">QQ好的</a> <!----> <!----> <div class="meta"><span>5楼 · 2019.04.26 11:13</span></div></div></div> <div class="comment-wrap"><p>你好,楼主,使用你的例子进行运行没有问题。但是自己写了一个参数是stream的叫报这个错误,楼主知道是什么原因吗?<br><br>Traceback (most recent call last):<br>  File "file_notify.python", line 47, in &lt;module&gt;<br>    run(line.strip())<br>  File "file_notify.python", line 32, in run<br>    response = stub.collect(param)<br>  File "/usr/lib64/python2.7/site-packages/grpc/_channel.py", line 672, in __call__<br>    return _end_unary_response_blocking(state, call, False, None)<br>  File "/usr/lib64/python2.7/site-packages/grpc/_channel.py", line 466, in _end_unary_response_blocking<br>    raise _Rendezvous(state, None, None, deadline)<br>grpc._channel._Rendezvous: &lt;_Rendezvous of RPC that terminated with:<br>        status = StatusCode.UNKNOWN<br>        details = "Exception iterating requests!"<br>        debug_error_string = "None"<br>&gt;</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-39635997" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-25610988" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/bd8de4111e15" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/7443766/5d5e2a57-a991-43e8-a6b5-44c916062df3.png?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a>  </div> <!----></div> <div class="info"><a href="/u/bd8de4111e15" target="_blank" class="name">Xlanglxx</a> <!----> <!----> <div class="meta"><span>4楼 · 2018.06.26 11:44</span></div></div></div> <div class="comment-wrap"><p>请教一下 pip install grpcio 报错:DEPENDENCY ERROR<br>    <br>    The target you are trying to run requires an OpenSSL implementation.<br>    Your system doesn't have one, and either the third_party directory<br>    doesn't have it, or your compiler can't build BoringSSL. 怎么解决呀</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-25610988" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-28505185" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/87aa64e54517" target="_blank">PotentialZhang</a>:
        </div> <!----></div> <span>编译python的时候加上ssl的依赖,重新编译python</span> <!----></p> <div class="sub-tool-group"><span>2018.09.11 15:39</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-25029597" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/30d9ea91f449" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/709123/2a9ff4c4-6c66-4cbb-a348-c251e76ed8e9.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a>  </div> <!----></div> <div class="info"><a href="/u/30d9ea91f449" target="_blank" class="name">逸舟科技</a> <!----> <!----> <div class="meta"><span>3楼 · 2018.06.11 11:46</span></div></div></div> <div class="comment-wrap"><p>非常不错,感谢分享</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-25029597" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-17784580" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/760ad7ad09e3" target="_blank" class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/9-cceda3cf5072bcdd77e8ca4f21c40998.jpg"></a>  </div> <!----></div> <div class="info"><a href="/u/760ad7ad09e3" target="_blank" class="name">leoarty</a> <!----> <!----> <div class="meta"><span>2楼 · 2017.11.25 16:42</span></div></div></div> <div class="comment-wrap"><p>棒噢~</p> <!----> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-17784580" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div></div></div> <!----> <div><!----></div></div></div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: RPC(Remote Procedure Call)和 gRPC 是两种不同的远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务的协议,它可以实现不同节点之间的通信。而gRPC是一种基于RPC协议的框架,它使用了Google开发的Protocol Buffers作为序列化和协议编解码器,以及HTTP/2作为网络传输协议。\[1\]\[2\]\[3\] 区别在于,gRPC相比传统的RPC框架具有以下特点: 1. 序列化和协议编解码器:gRPC使用Protocol Buffers作为默认的序列化和协议编解码器,它可以高效地序列化和传输数据。 2. 网络传输协议:gRPC使用HTTP/2作为网络传输协议,可以提供更高的性能和更低的延迟。 3. 多语言支持:gRPC支持多种编程语言,包括C++、Java、Python等,可以方便地在不同的语言之间进行通信。 4. 异步支持:gRPC支持异步调用,可以提高系统的并发性能。 5. 服务定义:gRPC使用Protocol Buffers定义服务接口和消息类型,可以自动生成客户端和服务端的代码,简化开发过程。 总之,gRPC是一种基于RPC协议的框架,通过使用Protocol Buffers和HTTP/2等技术,提供了更高效、更灵活的远程过程调用方式。 #### 引用[.reference_title] - *1* *2* *3* [RpcgRpc 简介汇总](https://blog.csdn.net/Jailman/article/details/126056469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值