记python使用grpc
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
记python使用grpc的更多相关文章
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- python中grpc配置asyncio使用
python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...
- python使用grpc调用rpc接口
proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...
- python 使用gRPC
Python gRPC 简介 grpc 是google 开源的一款rpc服务框架,可以轻松的实现跨语言的微服务,将项目中的各个模块独立出来,单独部署,独立升级,也可以根据模块的情况进行不同语言的变成. ...
- 记python版本管理--pyenv
随记: 众所周知,python2.x版本与3.x版本有比较大的区别,如果你是2.x版本的使用者,突然接了3.x版本的项目,或者反过来,遇到这种情况该怎么办呢?重新安装自己电脑上的python,来匹配对 ...
- python的gRPC示例
参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...
- 记一次GRPC使用报错排查
项目一直使用grpc作为服务交互程序,其中我负责的java模块第一次引用该框架:当框架搭建好后,建立客户端代码,报错: Runable Error:java.lang.IllegalAccessErr ...
- grpc(二)记一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN
1.起初是dingding一直报错: instance:服务器名 err:GrpcClient#placeOrder: io.grpc.StatusRuntimeException: UNKNOWN ...
- 记Python学习
上周学的Python,感觉有点忘了,现在回顾一下... 一.Python安装及测试:https://www.cnblogs.com/weven/p/7252917.html 例子: Python自带的 ...
随机推荐
- MySQL 的安装
MySQL的全部安装步骤. 1::本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...
- 连接H3C交换机的Console口连不上
一.故障:使用Console线连接交换机的Console口连不上. 处理步骤: 1.先把Console线连接好,一端连接交换机的Console口,另一端连接电脑的USB口. 2.安装Console线驱 ...
- 【QT】qt python install pip
https://pip.pypa.io/en/stable/installing/ http://www.runoob.com/w3cnote/python-pip-install-usage.htm ...
- table-cell width:1% 深入理解
问题描述 今天在使用Bootstrap给页面添加底部导航栏时,需要在手机下也使导航栏呈现水平排列的效果.最后在网上查找解决方法是,看到这样一个解决方法: .nav-justified > li ...
- EntityFramework Core:版本不一致问题
code first 更新数据库时候报版本不对或者未找到错误 解决方法: 在项目文件中添加以下节点: <PropertyGroup> <OutputType>Library&l ...
- NetCore2.0下使用EF CodeFirst创建数据库
本文所使用的VS版本:VS2017 15.3.0 首先新建一个.net core项目 取名NetCoreTask 使用模型视图控制器方式 新建Model层 在Model层下新建一个user实体类 1 ...
- 监听器----java
监听器简介: 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletR ...
- C#中的反射 Reflection
起初是因为这个4.0才新增的新的引用类型,我当时很惊讶为什么string和int他都能装,然后我就发在了群里,以为大佬告诉我他的内部实现是通过反射来实现的,于是我就去看反射了,看了网上的好多篇文章大篇 ...
- day1:java学习第一天之eclipse安装
选择开发语言的学习其实不用纠结,如果你说自己是做开发的,连最流行的开发语言都不会,好像说不过去,并且最流行也说明用的人多,优秀的人也会,自己要提高要多向优秀的人学习.想明白这点其实选择就好说了,再一个 ...
- RoboMongo命令(版本:Robo 3T 1.1.1)
查询并排序db.getCollection('working_history').find({"identification" : "76170178"}).s ...