找回密码
 立即注册
查看: 298|回复: 0

Python的GRPC通信

[复制链接]
发表于 2022-4-29 17:03 | 显示全部楼层 |阅读模式

  • 参考


  • 相关包
activate C:\python_Re\Python+Spyder\anaconda3

pip install grpcio
pip install grpcio-tools  
pip install protobuf1. RPC 和 GRPC

1.1 RPC(Remote Procedure Call Protocol)


  • RPC 是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上的函数
由于不在一个内存空间,不能直接调用,需要通过网络来飙到调用的语义和传达调用的数据

  • 比如:
在A服务内,调用B服务的ticket服务中的get方法,那么在a服务里,直接调用b.ticket.get()来直接调用
1.2 GRPC


  • gRPC 是一款高性能、开源的RPC框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等)
  • grpc传输协议传输的数据类型为protobuf数据.ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
  • 所以grpc都是和protobuf一块使用


1.3 Protobuf


  • 一个协议数据交换格式工具库


2. GRPC例程


  • 如果仍然报错,把终端窗口关掉重启



目录

2.1 定义gRPC的接口


  • 定义一个proto文件
syntax = "proto3";

package grpcLab;

service Bili{rpc HelloGrpc(HelloGrpcReq) returns (HelloGrpcReply){}}

message HelloGrpcReq{
        string name = 1;
        int32 age = 2;
        }

message HelloGrpcReply{
        string result = 1;
        }2.2 生成Python的代码
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=. ./hello_GRPC.proto利用编译工具把proto文件转化成py文件,直接在当前文件目录下运行上述代码即可。

  • -I 指定proto所在目录
  • -m 指定通过protoc生成py文件
  • --python_out指定生成py文件的输出路径
  • hello.proto 输入的proto文件
执行上述命令后,生成hello_GRPC_pb2.py 和hello_GRPC_pb2_grpc.py这两个文件。
2.3 服务端


  • 在服务器端代码中需要实现proto文件中定义的服务接口(FormatData),并重写处理函数(DoFormat),将重写后的服务类实例化以后添加到grpc服务器中.
#coding:utf-8
import grpc
import hello_GRPC_pb2 as pb2
import hello_GRPC_pb2_grpc as pb2_grpc
import time
from concurrent import futures #多线程

class Bili(pb2_grpc.BiliServicer):#和proto文件中花括号外的Bili一致
    def HelloGrpc(self, request, context):
        name = request.name
        age = request.age

        result = f'my name is {name}, i am {age} years old'#f表示字串内支持大括号的表达式
        return pb2.HelloGrpcReply(result = result)

#启动服务
def run():
    # 最大的线程数量
    grpc_server = grpc.server(
        futures.ThreadPoolExecutor(max_workers=4)
    )
    #注册Bili这个类到GRPC里面
    pb2_grpc.add_BiliServicer_to_server(Bili(),grpc_server)
    #绑定ip
    grpc_server.add_insecure_port('0.0.0.0:5000')
    print('server will start at 0.0.0.0:5000')
    #启动
    grpc_server.start()

    #用循环让它一直运行,直到有键盘输入退出服务
    try:
        while 1:
            time.sleep(3600)
    except KeyboardInterrupt:
        grpc_server.stop(0)

if __name__ == '__main__':
    run()



2.4 客户端

#coding:utf-8

import grpc
import hello_GRPC_pb2 as pb2
import hello_GRPC_pb2_grpc as pb2_grpc

def run():
    # 先定义一个频道
    conn = grpc.insecure_channel('localhost:5000')
    #设定客户端的频道
    client = pb2_grpc.BiliStub(channel=conn)
    response = client.HelloGrpc(pb2.HelloGrpcReq(
        name='Diamon',
        age=27
    ))
    print(response.result)

if __name__ == '__main__':
    run()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-3 16:39 , Processed in 0.188133 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表