在Python中使用gRPC的方法示例


Posted in Python onAugust 08, 2018

本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下:

在Python中使用gRPC的方法示例

使用Protocol Buffers的跨平台RPC系统。

安装

使用 pip

pip install grpcio
pip install grpcio-tools googleapis-common-protos

gRPC由两个部分构成,grpcio 和 gRPC 工具, 后者是编译 protocol buffer 以及提供生成代码的插件。

使用

编写protocol buffer

使用 gRPC 首先需要做的是设计 protocol buffer。新建一个 msg.proto 文件。

syntax = "proto3";

service MsgService {
 rpc GetMsg (MsgRequest) returns (MsgResponse){}
}

message MsgRequest {
  string name = 1;
}

message MsgResponse {
  string msg = 1;
}

以上面的这个消息服务为例,首先是规定语法,这里使用的是 proto3 的语法。接着使用 service 关键字定义服务,gRPC 提供4种 RPC 类型的服务,这里定义的是第一种单一请求单一回应,类似普通的函数调用,其他的使用到了 stream 关键字,将其放在括号里,代表这个数据是流数据。这个以后再来研究,本次先设计一个简单的RPC。

之后定义两个 message ,一个是请求的结构,一个是回应的结果。 这里表示这个数据结构是字符串,protocol buffer 还可以定义为 int32,int64,double,float 等等。这里赋予的初值可以随便填写,实际使用中,会被赋予新的值。

生成接口代码

因为之前安装好了一些辅助插件,使用这里直接可以生成。

python -m grpc_tools.protoc -I . --pythoout=. --grpc_python_out=. msg.proto

这里会生成两个文件, msg_pb2.pymsg_pb2_grpc.py 。这两个文件是为后续的服务端和客户端所用。前者是定义了一些变量,例如 _MSGREQUEST 中就包含了请求函数的名字,可接受的变量,实际上还是 msg.proto 里定义的东西。

创建服务端

首先需要导入 RPC 必备的包,以及刚才生成的两个文件。

import grpc
import msg_pb2
import msg_pb2_grpc

因为 RPC 应该长时间运行,考虑到性能,还需要用到并发的库。

from concurrent import futures
import time

_ONE_DAY_IN_SECONDS = 60 * 60 * 24

在 Server 中,主要是实现服务,按照 msg.proto 定义的,这里需要写一个服务类 MsgServicer ,这个类需要实现之前定义的 GetMsg

class MsgServicer(msg_pb2_grpc.MsgServiceServicer):

  def GetMsg(self, request, context):
    print("Received name: %s" % request.name)
    return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name)

GetMsg 接收到的请求是在 request 中, msg.proto 中定义的 name 就是 request.name ,接着在 GetMsg 中设计 msg.proto 中定义的 MsgResponse

之后实现启动服务的部分即可。

def serve():
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
  msg_pb2_grpc.add_MsgServiceServicer_to_server(MsgServicer(), server)
  server.add_insecure_port('[::]:50051')
  server.start()
  try:
    while True:
      time.sleep(_ONE_DAY_IN_SECONDS)
  except KeyboardInterrupt:
    server.stop(0)

通过并发库,将服务端放到多进程里运行。

完整 msg_server.py 代码如下

import grpc
import msg_pb2
import msg_pb2_grpc

from concurrent import futures
import time

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class MsgServicer(msg_pb2_grpc.MsgServiceServicer):

  def GetMsg(self, request, context):
    print("Received name: %s" % request.name)
    return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name)


def serve():
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
  msg_pb2_grpc.add_MsgServiceServicer_to_server(MsgServicer(), server)
  server.add_insecure_port('[::]:50051')
  server.start()
  try:
    while True:
      time.sleep(_ONE_DAY_IN_SECONDS)
  except KeyboardInterrupt:
    server.stop(0)

if __name__ == '__main__':
  serve()

创建客户端

客户端相对简单一些,这里我写了一个简单的客户端。

import grpc

import msg_pb2
import msg_pb2_grpc

def run():
  # NOTE(gRPC Python Team): .close() is possible on a channel and should be
  # used in circumstances in which the with statement does not fit the needs
  # of the code.
  with grpc.insecure_channel('localhost:50051') as channel:
    stub = msg_pb2_grpc.MsgServiceStub(channel)
    response = stub.GetMsg(msg_pb2.MsgRequest(name='world'))
  print("Client received: " + response.msg)


if __name__ == '__main__':
  run()

使用 grpc.insecure_channel('localhost:50051') 进行连接 服务端, 接着在这个 channel 上创建 stub , 在 msg_pb2_grpc 里可以找到 MsgServiceStub 这个类相关信息。这个 stub 可以调用远程的 GetMsg 函数。 MsgRequest 中的 namemsg.proto 中定义的数据。在回应里可以得到 msg.proto 中定义的 msg

运行

首先运行 python msg_server.py 启动服务端,接着运行 python msg_client.py 机会看到客户端接收到了服务端传来的消息。以上就是一个简单的 RPC 的使用。

总结

这里只是简单的用了一下 gRPC,关于另外三种模式,还在摸索。比起gRPC,我感觉简单 RestFul 更讨我喜欢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python生成指定尺寸缩略图的示例
May 07 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
Python自动连接ssh的方法
Mar 07 Python
matplotlib作图添加表格实例代码
Jan 23 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
python中for用来遍历range函数的方法
Jun 08 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 #Python
python实现彩票系统
Jun 28 #Python
django框架自定义用户表操作示例
Aug 07 #Python
Python实现基于POS算法的区块链
Aug 07 #Python
tensorflow学习教程之文本分类详析
Aug 07 #Python
Django添加feeds功能的示例
Aug 07 #Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 #Python
You might like
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
PHP常用的小程序代码段
2015/11/14 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python 递归函数详解及实例
2016/12/27 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python实现文件的备份流程详解
2019/06/18 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
中学教师岗位职责
2013/11/26 职场文书
公司晚会主持词
2014/03/22 职场文书
交通事故协议书范文
2014/04/16 职场文书
医药销售自荐书
2014/05/29 职场文书
商家认证委托书格式
2014/10/16 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
教师节感谢信
2015/01/22 职场文书
幼师中班个人总结
2015/02/12 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL