Python:GRPC接口编写之如何编写服务端与客户端

上次我们讲了如何生成ABC_pb2.py 和 ABC_pb2_grpc.py,这次我们来讲述如何使用这两个文件来编写服务端、客户端,完成远程调用。(其实服务端有些部分的编写我也没太明白就照搬了,但是你按我说的去修改自己的文件,不出意外是能正常跑的)

下面ABC_pb2.py简称pd2文件,ABC_pb2_grpc.py简称grpc文件。

因为我在学习接口编写的时候,发现网上一些示例的参数名称写的都一模一样,所以写函数的时候我绕了一段时间;其次就是他们写的例子很简单,我的调用稍复杂些,所以多出来的部分不知道该怎么写。

所以这次我专门编写了例子,参数名尽量使用个性化的、不相同的,以便大家区分每个部分的作用和位置。

我会试着共享这几个文件,文中用到哪些部分我会截图放上,主要就是参考proto、grpc文件中的函数及变量名。

呃……好像资源需要积分才能下载。那我把我的文件代码都附在文章最后吧,给大家省一点哈哈。

我的proto文件:lwz_model.proto

编译出的两个文件:lwz_model_pb2_grpc.py, lwz_model_pb2.py

服务端:lwz_sever.py

客户端:lwz_client.py

 

一、服务端、客户端所用得到的函数及变量名

其实如果将我给的服务端、客户端相应部分进行替换,就可以简单的改写成你自己的服务端与客户端。那么接下来就简单列出替换所用到的函数及变量名。

1、proto文件中的部分

其实proto文件的结构你梳理清楚了,难度就减少了一大半了。

  • 20
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
本门课程是带大家进入微服务领域入门的课程,很适合新手小白学习的课程。1: 什么是rpc?RPC(Remote Procedure Call)是函数对函数的远程调用,传输协议tcp,http,主要是基于xml,json序列化协议(这里的序列化协议是对数据编解码的方式),项目中我们真正用到的是grpcgrpc是一个框架,基于http2.0的长链接,性能有所改进,重要的是grpc用的是Google开源的protobuf序列化协议,它比json,xml性能更快,在压缩数据方面也更小。总之我们选择grpc最主要的有两点:1:支持跨语言开发(如python,golang,java)2:  grpc首先是一个框架,封装rpc,让程序员只关注代码逻辑即可 2: 为什么用grpc,而不用flask,django,tornado,即http协议?1:http的调用是根据url的(即restful),它跟rpc的调用最大的区别就是这里,rpc的调用,你就像调用一个本地函数一样简单,而且微服务,分布式也是从rpc开始的,学好rpc对以后做好分布式会更有帮助,其实go语言和python语言里都有rpc(如xmlrpc,jsonrpc,zerorpc),我们之所以学习go语言里的rpc是因为go语言的rpc相对更加灵活,go语言本身也支持高并发,这一点对于分布式来说更好。2:其次http协议,用过flask框架的人都知道,请求一次数据后就断开,而grpc基于http2.0,它不但可以保持长链接,传输效率也更高,使用方面,因为http2.0相当于tcp一样使用,现在很多大厂也都开始用http2.0了。http2.0相比http的优势很明显,头部压缩,分流,针对tcp的多路复用。所以基于http2.0的grpc无论从生态和性能方面都更好。 这张图是一个gRPC相关的架构图,同学们可以通过这张图了解gRPC在项目中的使用。
下面是一个简单的Python代码示例,演示如何使用gRPC实现客户端服务端的多进程并发执行: 服务端代码: ```python import grpc from concurrent import futures import time import hello_pb2 import hello_pb2_grpc class HelloService(hello_pb2_grpc.HelloServicer): def sayHello(self, request, context): print("Received message: ", request.message) return hello_pb2.HelloReply(message="Hello, %s!" % request.message) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) hello_pb2_grpc.add_HelloServicer_to_server(HelloService(), server) server.add_insecure_port("[::]:50051") server.start() print("Server started at [::]:50051") while True: time.sleep(86400) if __name__ == '__main__': serve() ``` 客户端代码: ```python import grpc import hello_pb2 import hello_pb2_grpc from concurrent import futures import multiprocessing def run_client(): channel = grpc.insecure_channel("localhost:50051") stub = hello_pb2_grpc.HelloStub(channel) response = stub.sayHello(hello_pb2.HelloRequest(message="world")) print("Response received from server: ", response.message) if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) for i in range(4): pool.apply_async(run_client) pool.close() pool.join() ``` 在上面的示例中,服务端使用了Python的concurrent.futures模块创建了一个线程池,用于处理客户端的请求,同时使用了Python的multiprocessing模块创建了多个子进程,同时向服务端发起请求。客户端通过调用multiprocessing.Pool()方法创建进程池,并使用apply_async()方法异步调用run_client()方法,实现了多个客户端同时向服务端发起请求的并发执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值