Ubuntu18.04安装gRPC

  • protobuf-compiler-grpc安装

    sudo apt-get install protobuf-compiler-grpc
  • protobuf-compiler安装

    sudo apt-get install protobuf-compiler
  • gRPC 的安装

    pip install grpcio
  • 安装 ProtoBuf 相关的 python 依赖库

    pip install protobuf
  • 安装 python grpc 的 protobuf 编译工具

    pip install grpcio-tools

编写示例工程

  • 工程结构

  • 编写 proto 文件

    在工程下新建stream目录,新建stream.proto文件,文件可名称任意
    syntax = "proto3";
    package stream;
    service StreamService {
    rpc SimpleFun(RequestData) returns (ResponseData){}
    }
    message RequestData {
    string text = 1;
    } message ResponseData {
    string text = 1;
    }
  • 编译 protobuf

    切换至stream目录,执行以下命令:

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

stream目录中执行编译,会生成:stream_pb2.pystream_pb2_grpc.py,需修正stream_pb2_grpc.py的引用stream__pb2的路径

  • 实现 server 端,simple_server.py
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import grpc
    import time
    from concurrent import futures
    from stream import stream_pb2, stream_pb2_grpc _ONE_DAY_IN_SECONDS = 60 * 60 * 24
    _HOST = 'localhost'
    _PORT = '8883' class servicer(stream_pb2_grpc.StreamServiceServicer): def SimpleFun(self, request, context):
    str = request.text
    print("received: " + str)
    return stream_pb2.ResponseData(text=('hello,gRPC')) def serve():
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
    stream_pb2_grpc.add_StreamServiceServicer_to_server(servicer(), 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端,simple_client.py
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import grpc
    from stream import stream_pb2, stream_pb2_grpc _HOST = 'localhost'
    _PORT = '8883' def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)
    client = stream_pb2_grpc.StreamServiceStub(channel=conn)
    response = client.SimpleFun(stream_pb2.RequestData(text='hello,world!'))
    print("received: " + response.text) if __name__ == '__main__':
    run()
  • 执行结果

    先启动simple_server.py再启动simple_client.py

  • 完整代码

    https://github.com/gm19900510/stream_grpc

python gRPC简单示例的更多相关文章

  1. Python Thrift 简单示例

    本文基于Thrift-0.10,使用Python实现服务器端,使用Java实现客户端,演示了Thrift RPC调用示例.Java客户端提供两个字符串参数,Python服务器端计算这两个字符串的相似度 ...

  2. python psutil简单示例

    python psutil简单示例 利用psutil编写简单的检测小脚本 0.安装psutil模块                                                    ...

  3. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  4. C#调用Python脚本的简单示例

    C#调用Python脚本的简单示例 分类:Python (2311)  (0)  举报  收藏 IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Huguni ...

  5. Python自定义线程类简单示例

    Python自定义线程类简单示例 这篇文章主要介绍了Python自定义线程类,结合简单实例形式分析Python线程的定义与调用相关操作技巧,需要的朋友可以参考下.具体如下: 一. 代码     # - ...

  6. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

  7. robot framework环境搭建和简单示例

    环境搭建 因为我的本机已经安装了python.selenium.pip等,所以还需安装以下程序 1.安装wxPythonhttp://downloads.sourceforge.net/wxpytho ...

  8. AJAX的简单示例:注册校验

    众所周知,我们每次需要注册一个网站的用户名时,都会校验该邮箱.用户名是不是正确的格式.是不是有被使用过,密码是否符合规则,二次确认是否符合. 如果这些校验都采用form表单提交的话,会给用户带来极不好 ...

  9. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

随机推荐

  1. 第六周&实验四

    二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造方法,将半径置0 Cir ...

  2. vue一些注意事项

    1.生命周期钩子的 this 上下文指向调用它的 Vue 实例. 不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$wa ...

  3. 一次性生产KEY

    keytool -genkey -alias rebuild -keypass rebuild -keyalg RSA -keysize -validity -keystore rebuild.key ...

  4. 字符 kotlin(3)

    字符 用 Char 类型表示.它们不能直接当作数字) { // 错误:类型不兼容 // …… }} 字符字面值用单引号括起来: '1' . 特殊字符可以用反斜杠转义. 支持这几个转义序列: \t . ...

  5. 使用hash拆分文件

    package readImgUrl; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.i ...

  6. JAVA基础面试汇总

    一.基础知识:1.JVM.JRE和JDK的区别:    JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性.                  java ...

  7. 阶段3 2.Spring_09.JdbcTemplate的基本使用_4 JdbcTemplate的CRUD操作

    复制demo起名3 保存 update delete selct 有这么多的重载方法 如何去定位 可变参数是JDK1.5版本之后才有的东西 RowMapper 实现RowMapper这个接口.然后实现 ...

  8. 二十一:jinja2之模板继承

    模板继承可以把有共性的一些代码抽出来放到父模板中,其他需要次特性的文件继承模板即可 在jinja2中,使用extends来继承定义好的模板,使用{% block 位置名%} {% endblock % ...

  9. 本地虚拟机部署线上php程序---不需要修改数据库信息

    1.特别注意:拿来线上php程序后一般是不需要修改config.php里面的数据库连接信息的,如果修改了会报错:站点已关闭.所以 2.5 步骤是需要省略的.如果拿来的是最开始的php源码,需要配置原始 ...

  10. elasticsearch 修改 mapping

    Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段.但现实往往并非如此啊,有时增加一个字段,就好像打了一个补丁,一个可以,但是越补越多,最后自己都觉得 ...