using grpc in Python

gRPC是基于http/2的RPC框架,使用ProtoBuf作为底层数据序列化。Nginx服务器2018年3月17日引入gRPC支持。

gRPC 是用来实现跨语言通信的。比如在你的某个功能里需要用的同事写的接口,而你们俩又不是同一种语言。此时有两种方案,一是使用.so 文件;另一种则是使用 RPC 框架。

创建一个grpc_demo项目,结构如下

grpc_demo/

├── client

│ └── client.py

├── example

│ └── data.proto

└── server

​ └── server.py

  • client目录下的client.py实现了客户端用于发送数据并打印接收到server端处理后的数据
  • server目录下的server.py实现了server端用于接收客户端发送的数据,并对数据进行简单处理后返回给客户端
  • example包用于编写proto文件并生成data接口

grpc安装

  • 安装gRPC

    pip install grpcio

  • 安装 ProtoBuf 相关的 python 依赖库

    pip install protobuf

  • 安装 python grpc 的 protobuf 编译工具

    pip install grpcio-tools

定义gRPC接口

data.proto文件,service关键字就是定义接口,message定义数据结构

syntax = "proto3";

service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
} message HelloRequest {
string name = 1;
string message = 2;
string location = 3;
string ip = 4;
} message HelloReply {
string name = 1;
string message = 2;
string location = 3;
string ip = 4;
}

编译protobuf生成所需文件(服务端和客户端都需要)

# mkdir gen-py
# python -m grpc_tools.protoc --proto_path=./ --python_out=./gen_py --grpc_python_out=./gen_py ./data.proto

在gen-py目录下生成data_pb2_grpc.py和data_pb2.py两个文件。

生成后完整目录结构:

grpc_demo

├── client

│ └── client.py

├── example

│ ├── data.proto

│ └── gen_py

│ ├── data_pb2_grpc.py

│ └── data_pb2.py

└── server

​ └── server.py

服务端实现

#!/usr/bin/env python
# -*- coding: utf-8 -*- import sys
sys.path.append('../example/gen_py')
import grpc
import time
from concurrent import futures
import data_pb2
import data_pb2_grpc _ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = "127.0.0.1"
_PORT = "19999" class HelloWorld(data_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
print("request: " + str(request))
return data_pb2.HelloReply(message='%s, %s!' % (request.message, request.name)) def server():
grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
data_pb2_grpc.add_GreeterServicer_to_server(HelloWorld(), grpcServer)
grpcServer.add_insecure_port("{0}:{1}".format(_HOST, _PORT))
grpcServer.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
grpcServer.stop(0) if __name__ == '__main__':
server()

客户端实现

#!/usr/bin/env python
# -*- coding: utf-8 -*- import sys
sys.path.append("../example/gen_py")
import grpc
import data_pb2
import data_pb2_grpc _HOST = '127.0.0.1'
_PORT = '19999' def run():
with grpc.insecure_channel("{0}:{1}".format(_HOST, _PORT)) as channel:
client = data_pb2_grpc.GreeterStub(channel=channel)
response = client.SayHello(data_pb2.HelloRequest(name='you', message='hey guys'))
print("received: " + response.message) if __name__ == '__main__':
run() #channel = grpc.insecure_channel("{0}:{1}".format(_HOST, _PORT))
#client = data_pb2_grpc.GreeterStub(channel=channel)
#response = client.SayHello(data_pb2.HelloRequest(name='you', message='hey guys'))
#print("received: " + response.message)

参考:

https://blog.codeship.com/using-grpc-in-python/

https://github.com/geekan/grpc-python-demos

http://doc.oschina.net/grpc

记python使用grpc的更多相关文章

  1. 技术实践:教你用Python搭建gRPC服务

    摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...

  2. python中grpc配置asyncio使用

    python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...

  3. python使用grpc调用rpc接口

    proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...

  4. python 使用gRPC

    Python gRPC 简介 grpc 是google 开源的一款rpc服务框架,可以轻松的实现跨语言的微服务,将项目中的各个模块独立出来,单独部署,独立升级,也可以根据模块的情况进行不同语言的变成. ...

  5. 记python版本管理--pyenv

    随记: 众所周知,python2.x版本与3.x版本有比较大的区别,如果你是2.x版本的使用者,突然接了3.x版本的项目,或者反过来,遇到这种情况该怎么办呢?重新安装自己电脑上的python,来匹配对 ...

  6. python的gRPC示例

    参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...

  7. 记一次GRPC使用报错排查

    项目一直使用grpc作为服务交互程序,其中我负责的java模块第一次引用该框架:当框架搭建好后,建立客户端代码,报错: Runable Error:java.lang.IllegalAccessErr ...

  8. grpc(二)记一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN

    1.起初是dingding一直报错: instance:服务器名 err:GrpcClient#placeOrder: io.grpc.StatusRuntimeException: UNKNOWN ...

  9. 记Python学习

    上周学的Python,感觉有点忘了,现在回顾一下... 一.Python安装及测试:https://www.cnblogs.com/weven/p/7252917.html 例子: Python自带的 ...

随机推荐

  1. RMAN备份filesperset用法

    用filesperset控制备份集的尺寸 当指定filesperset参数时,rman比较filesperset与自动计算出来的值(对每个已分配通道的文件数目) 并取其中较小的那个值来保证所有的通道被 ...

  2. 多个.txt文件合并到一个.txt文件中

    如果想要将多个.txt文件合并到一个.txt文件中,可以先将所有.txt文件放到一个文件夹中,然后使用.bat文件完成任务. 例如,在一个文件夹下有1.txt, 2.txt, 3.txt三个文件,想把 ...

  3. 模拟网络状况工具——clumsy

    官网:http://jagt.github.io/clumsy/index.html 官网上的介绍已经很易懂了,所以本文只是直接翻译了官网内容. clumsy 能在 Windows 平台下人工造成不稳 ...

  4. 【Git】修改git远程连接ip

  5. 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议

    本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight's Dialer:翻译:实验楼 ...

  6. Tomcat配置Web默认页面

    1.在web.xml中配置要加载的首页 <welcome-file-list> <welcome-file>Tiring-room/index.jsp</welcome- ...

  7. php通过phpize安装扩展

    //下载libevent扩展文件压缩包(在当前系统哪个目录下载随意) ~# wget http://pecl.php.net/get/libevent-0.1.0.tgz //解压文件 ~# tar ...

  8. C# 弹出确定、取消窗口

    if (MessageBox.Show("确定要退出吗?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Qu ...

  9. 2017.12.7 URAT 串口通信

    波特率就是发送二进制数据位的速率, 习惯上用 baud 表示, 即我们发送一位二进制数据的持续时间=1/baud. 在通信之前, 单片机 1 和单片机 2 首先都要明确的约定好它们之间的通信波特率, ...

  10. Java -- 构造函数 & this & 方法重写和方法重载的区别

    JAVA: 今天总结一下构造方法.关键字.方法重载和方法重写的异同   一.构造方法(构造函数)1.构造方法的作用:一是创建对象时调用构造方法创建对象,二是可以初始化多个属性 [学生类创建一个学生对象 ...