python下grpc与protobuf的编写使用示例

目录
  • 1. python下protobuf使用
    • 1.1 安装protobuf
    • 1.2 protobuf3定义格式
    • 1.3 生成proto的python文件
    • 1.4 对比一下protobuf生成的效果
  • 2.python下grpc使用
    • 2.1编写hello.proto文件
    • 2.2 生成proto的python文件
    • 2.3 编写server端
    • 2.4 编写cilent端

1. python下protobuf使用

1.1 安装protobuf

pip3.6 install grpcio #安装grpc
pip3.6 install grpcio-tools #安装grpc tools

1.2 protobuf3定义格式

新建protobuf文件名:hello.proto

syntax = "proto3";
message HelloRequest {
  string name = 1;
}

1.3 生成proto的python文件

cd hello.proto文件路径下
命令:python3.6 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto
注意:只有python生成两个文件
命令解释:
python3.6 -m grpc_tools.protoc:实际需要使用grpc_tools.protoc这里面的命令
--python_out=. :生成的python文件放在当前路径下,这是给rpc用的文件
--grpc_python_out=. :生成的python文件放在当前路径下,这是给grpc用的文件
-I.:指import,当前目录下找hello.proto文件

1.4 对比一下protobuf生成的效果

res.SerializeToString() # 序列化二进制
res2.ParseFromString(res_str) # 反序列化二进制
import json
from python_grpc.proto import hello_pb2
def main():
    res = hello_pb2.HelloRequest()
    res.name = "jeff"
    res_str = res.SerializeToString() # 序列化二进制
    print(res_str) # b'\n\x04jeff'
    print(len((res_str))) # 6,和json对比,josn长度为:16
    res2 = hello_pb2.HelloRequest()
    res2.ParseFromString(res_str) # 反序列化二进制
    print(res2.name) # jeff
    res_json = {
        "name":"jeff"
    }
    print(len(json.dumps(res_json))) # 16,json和proto压缩对比,proto压缩后:6
if __name__ == '__main__':
    main()

2.python下grpc使用

2.1编写hello.proto文件

syntax = "proto3";
package services;
option go_package = "./;proto";
service Greeter {
    // 定义SayHello方法
    rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
    string name = 1; //编号
}
message HelloReply {
    string message = 1; //编号
}

2.2 生成proto的python文件

cd hello.proto文件路径下
命令:python3.6 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto
注意:只有python生成两个文件
命令解释:
python3.6 -m grpc_tools.protoc:实际需要使用grpc_tools.protoc这里面的命令
--python_out=. :生成的python文件放在当前路径下,这是给rpc用的文件
--grpc_python_out=. :生成的python文件放在当前路径下,这是给grpc用的文件
-I.:指import,当前目录下找hello.proto文件
注意:生成的*_grpc.py文件的导包需要修改,否则报错:要让python找到hello_pb2
import hello_pb2 as hello__pb2 改为:
from python_grpc.proto import hello_pb2 as hello__pb2

2.3 编写server端

from concurrent import futures
import grpc
from python_grpc.proto import hello_pb2, hello_pb2_grpc
# 业务处理
class Greeter(hello_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return hello_pb2.HelloReply(message=f"你好,{request.name}")
# 启动
def start():
    # 1.实例化server
    Thread = futures.ThreadPoolExecutor(max_workers=10)  ## 设置线程池,并发大小
    server = grpc.server(Thread)
    # 2.注册逻辑到server中
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    # 3.启动server
    server.add_insecure_port("127.0.0.1:8888")
    server.start()
    server.wait_for_termination()
if __name__ == '__main__':
    start()

2.4 编写cilent端

import grpc
from python_grpc.proto import hello_pb2, hello_pb2_grpc
# rpc调用
def main():
    # 这里使用with,调用完会自动关闭。优雅写法
    with grpc.insecure_channel("127.0.0.1:8888") as channel:
        stub = hello_pb2_grpc.GreeterStub(channel)
        # 调用定义的SayHello方法
        rep = stub.SayHello(
            hello_pb2.HelloRequest(name="jeff")  # 传递定义的HelloRequest类型参数
        )
        return rep
# 业务代码
def start():
    rep = main()
    print(rep.message)  # 你好,jeff
if __name__ == '__main__':
    start()

以上就是python下grpc与protobuf的编写使用的详细内容,更多关于python grpc与protobuf编写使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • python开发一个解析protobuf文件的简单编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ply使用 简介 如果你不是从事编译器或者解析器的开发工作,你可能从未听说过ply.ply是基于python的lex和yacc,而它的作者就是大名鼎鼎Python Cookbook, 3rd Edition的作者.可能有些朋友就纳闷了,我一个业务开发怎么需要自己写编译器呢,各位编程大牛说过,中央决定

  • Python使用protobuf序列化和反序列化的实现

    protobuf介绍 protobuf是一种二进制的序列化格式,相对于json来说体积更小,传输更快. 安装protobuf 安装protobuf的目的主要用来将proto文件编译成python.c.Java可调用的接口. # 如果gcc版本较低,需要升级gcc wget https://main.qcloudimg.com/raw/d7810aaf8b3073fbbc9d4049c21532aa/protobuf-2.6.1.tar.gz tar -zxvf protobuf-2.6.1.ta

  • 在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 首先需要做的是设计 p

  • Python使用gRPC传输协议教程

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

  • python使用rpc框架gRPC的方法

    概述 gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2). rpc: remote procedure call, 翻译过来就是是远程程序调用.具体来说,就是客户端c1需要调用服务器s1上的某个方法(函数),得到相应的返回值并传递给c1. gRPC协议 要说gRPC协议需要先了解HTTP2, 虽然HTTP1.X 协议至今仍是主流协议,但是随着我们对性能要求越来越高,和web规模的不断扩大,HTTP2就应运而生. 在这里,我们

  • python如何通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍.rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性.为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用.rpc架构涉及的组件如下: 客户方像调用本地方法一样去调用远程接口方法,R

  • python下grpc与protobuf的编写使用示例

    目录 1. python下protobuf使用 1.1 安装protobuf 1.2 protobuf3定义格式 1.3 生成proto的python文件 1.4 对比一下protobuf生成的效果 2.python下grpc使用 2.1编写hello.proto文件 2.2 生成proto的python文件 2.3 编写server端 2.4 编写cilent端 1. python下protobuf使用 1.1 安装protobuf pip3.6 install grpcio #安装grpc

  • golang下grpc框架的使用编写示例

    目录 1. 什么是grpc和protobuf 1.1 grpc 1.2 protobuf 2.go下grpc 2.1官网下载protobuf工具 2.2 下载go的依赖包 2.3 编写proto文件 2.4 生成hello.pb.proto文件 2.5 编写server端代码 2.6 编写client端代码 2.7 python和go相互调用实践(跨语言调用) 1. 什么是grpc和protobuf 1.1 grpc gRPC是一个高性能.开源和通用的RPC框架,面向移动和HTTP/2设计. 目

  • Python下载网易云歌单歌曲的示例代码

    今天写了个下载脚本,记录一下 效果: 直接上代码: # 网易云 根据歌单链接下载MP3歌曲 import requests from bs4 import BeautifulSoup def main(): url = "https://music.163.com/#/playlist?id=3136952023" # 歌单地址 请自行更换 if '/#/' in url: url = url.replace('/#/', '/') headers = { 'Referer': 'ht

  • Python下线程之间的共享和释放示例

    最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大 1.python 类变量 在多线程情况 下的 是共享的 2.python 类变量 在多线程情况 下的 释放是不完全的 3.python 类变量 在多线程情况 下没释放的那部分 内存 是可以重复利用的 import threading import time class Test: cache = {} @classmethod def get_value(self, key): value

  • C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能

    初识gRPC还是一位做JAVA的同事在项目中用到了它,为了C#的客户端程序和java的服务器程序进行通信和数据交换,当时还是对方编译成C#,我直接调用. 后来,自己下来做了C#版本gRPC编写,搜了很多资料,但许多都是从入门开始?调用说"Say Hi!"这种官方标准的入门示例,然后遇到各种问题-- 关于gRPC和Protobuf介绍,就不介绍了,网络上一搜一大把,随便一抓都是标准的官方,所以直接从使用说起. gPRC源代码:https://github.com/grpc/grpc: p

  • 如何用Python搭建gRPC服务

    目录 一.概述 二.安装python需要的库 三.定义gRPC的接口 四.使用 protoc 和相应的插件编译生成对应语言的代码 五.编写grpc的服务端代码 六.编写gRPC客户端的代码 七.调用测试 八.gRPC的使用总结 一.概述 一个gRPC服务的大体结构图为: 图一表明,grpc的服务是跨语言的,但需要遵循相同的协议(proto).相比于REST服务,gPRC 的一个很明显的优势是它使用了二进制编码,所以它比 JSON/HTTP 更快,且有清晰的接口规范以及支持流式传输,但它的实现相比

  • golang 微服务之gRPC与Protobuf的使用

    RPC是什么? 所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型.使用的时候客户端调用server端提供的接口就像是调用本地的函数一样. gRPC是什么? 与许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法.默认情况下,gRPC使用协议缓冲区作为接口定义语言(IDL)来描述服务接口和有效负载消息的结构. gRPC有什么好处以及在什么场景下

  • python配置grpc环境

    gRPC 的安装: $ pip install grpcio 安装 ProtoBuf 相关的 python 依赖库: $ pip install protobuf 安装 python grpc 的 protobuf 编译工具: $ pip install grpcio-tools 测试 //源码路径 https://github.com/grpc/grpc git clone https://github.com/grpc/grpc cd grpc/examples/python/hellowo

  • python 下划线的不同用法

    在本文中,我们将介绍 Python 中 _ 字符的不同用法.就像 Python 中的许多其他内容一样,我们会看到 "_" 的不同用法主要是惯例问题.这里我们将介绍的几种不同情况: 单下划线(例如 _) 名称前加一个下划线(例如 _total) 名称后加一个下划线(例如 total_) 数字文字中的单个下划线(例如 100_000) 名称前加上双下划线(例如 __total) 名称前后加双下划线(例如 __init__) 一.单下划线(_) 单下划线通常在3种情况下使用: 1.在解析程序

随机推荐