首页 > 编程语言 >Go/Python gRPC实践

Go/Python gRPC实践

时间:2022-12-12 13:23:13浏览次数:53  
标签:err pb2 Python proto server grpc gRPC Go hello

gRPC框架 & ProtoBuf

安装相关工具:

pip3 install grpcio
pip3 install grpcio-tools 

protobuf3有自己专门的定义的格式,基于此可以生成不同的脚本

编写示例的protobuf3:

syntax = "proto3";

message HelloRequest {
  string name = 1;
}

生成代码:

python3 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

生成文件:

hello_pb2_grpc.py  hello_pb2.py 

调用示例:

import hello_pb2

request = hello_pb2.HelloRequest()
request.name = "David"
# 对象生成字符串
res = request.SerializeToString()
print(res)

# 通过字符串反向生成对象
request2 = hello_pb2.HelloRequest()
request2.ParseFromString(res)
print(request2.name)

定义proto文件

syntax = "proto3";

service Greeter {
  rpc SayHello(HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

生成文件:

python3 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

示例代码

服务器端:

import hello_pb2
import hello_pb2_grpc
import grpc
from concurrent import futures

class Greeter(hello_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return hello_pb2.HelloReply(message=f"Hello, {request.name}")

if __name__ == "__main__":
    # 实例化server
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    # 注册逻辑到server
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(),server)
    server.add_insecure_port('localhost:50051')
    server.start()
    server.wait_for_termination()

客户端:

import grpc
import hello_pb2,hello_pb2_grpc

if __name__ == "__main__":
    with grpc.insecure_channel("localhost:50051") as channel:
        stub = hello_pb2_grpc.GreeterStub(channel)
        rsp: hello_pb2.HelloReply = stub.SayHello(hello_pb2.HelloRequest(name="David"))
        print(rsp.message)

客户端直接如同调用本地函数一样调用远程函数SayHello,只要写好规则就能自动生成代码

在Go语言中也是同理,将以上proto文件放到一个目录下,使用protoc生成:

protoc -I=. --go_out=plugins=grpc:. hello.proto

生成了hello.pb.go文件

服务端代码:

type Server struct{}

func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
	return &proto.HelloReply{
		Message: "hello " + request.Name,
	}, nil
}

func main() {
	s := grpc.NewServer()
	proto.RegisterGreeterServer(s, &Server{})
	lis, err := net.Listen("tcp", "0.0.0.0:8080")
	if err != nil {
		panic("failed to listen:" + err.Error())
	}
	err = s.Serve(lis)
	if err != nil {
		panic("failed to start grpc:" + err.Error())
	}
}

客户端代码:

func main() {
	conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	c := proto.NewGreeterClient(conn)
	r, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "David"})
	if err != nil {
		panic(err)
	}
	fmt.Println(r.Message)
}

同时Python和Go是可以互相调用的

也就是说,Python开启服务器时,Go的客户端可以使用RPC调用,反之亦然

标签:err,pb2,Python,proto,server,grpc,gRPC,Go,hello
From: https://www.cnblogs.com/N3ptune/p/16975785.html

相关文章

  • 每日一抄 Go语言使用select切换协程
    看了两篇博客,一个说:在任何一个case中执行break或者return,select就结束了。另一个说:break只能跳出select中的一个case验证了一下,不知道对不对,感觉是跳出了整个selec......
  • Python 接收解析用户输入参数
    方式一:importsys,getopt;if(__name__=='__main__')or(__name__=='main'):##参数0是文件名+后缀##参数一 Name=sys.argv[1];......
  • 推荐《用Python进行自然语言处理》中文翻译-NLTK配套书
    NLTK配套书《用Python进行自然语言处理》(NaturalLanguageProcessingwithPython)已经出版好几年了,但是国内一直没有翻译的中文版,虽然读英文原版是最好的选择,但是对......
  • Python猫荐书系列:文也深度学习,理也深度学习
    最近出了两件大新闻,相信大家可能有所耳闻。我来当个播报员,给大家转述一下:1、中国队在第11界罗马尼亚数学大师赛(RMM)中无缘金牌。该项赛事是三大国际赛事之一,被誉为中学奥数......
  • python爬虫单线程与多线程区别
    之前有人请我帮忙写一个有关招聘的爬虫,一开始先是单线程,结果显而易见非常慢,后来改了多线程,速度杠杠的。1、单线程importurllibimporturllib.requestimportrequestsimport......
  • Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)
    前言今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得。首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的......
  • 力扣852(java&python3)-山脉数组的峰顶索引(中等)
    题目:符合下列属性的数组arr称为山脉数组:arr.length>=3存在i(0<i <arr.length-1)使得:arr[0]<arr[1]<...arr[i-1]<arr[i]arr[i]>arr[i+1]>...>......
  • python如何开发一个GUI图形应用?
    需求:我想学习,python如何开发一个GUI图形应用?解决:总共分两部分:前端ui和后端逻辑py。 前端ui1.导入模块pipinstallPySide22.找到designer.exe 打开......
  • 用Python将图片转为字符画
    今天打算玩个好玩的,也是基于一个优秀的图像处理库——PIL,使用ascii字符把图片转为黑白字符画。首先有个问题,就是模拟灰度,这里有个公式:Gray=0.2126×R+0.7152×G+0......
  • 你应该知道的17个Golang包
    前言随着时间的推移,语言爱好者已经构建和共享了许多Go框架和库。这些包执行不同的功能,从开发微服务到制作discord机器人,一直到构建Web应用程序!在本文中,我将尝试让您熟......