27.grpc python 使用教程

1.写protobuf 文件


syntax = "proto3";

package rpc_package;

// define a service
service AirRecognitionService {
    // define the interface and data type

    rpc  SVMAirRecognition(MLAirRequest) returns (MLAirReply) {}
    rpc  CNNAirRecognition(DLAirRequest) returns (DLAirReply) {}

}

// define the data type of request
message MLAirRequest {

      int32 fs_rate=1;
      repeated float sig=2;#传入一维数组


}

// define the data type of response
message MLAirReply {
    string mlmessage = 1;

}


// define the data type of request
message DLAirRequest {

      int32 fs_rate=1;
      repeated float sig=2;传入一维数组


}

// define the data type of response
message DLAirReply {
    string dlmessage = 1;

}

2.使用protobuf 编译器生成
#根据你自己的文件夹函数部署可修改下面代码

python -m grpc_tools.protoc -I=./protos --python_out=./rpc_package --grpc_python_out=./rpc_package ./protos/AirRecognition.proto

我的文件部署是
27.grpc python 使用教程_第1张图片
3.在 AirRecognition_client.py中写

# @File  : AirRecognition_client.py
# @Author: Wang Zhimin
# @Date  :  2019/10/28
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import logging
import cv2
import grpc
from rpc_package.AirRecognition_pb2 import MLAirRequest,DLAirRequest
from rpc_package.AirRecognition_pb2_grpc import AirRecognitionServiceStub
import numpy as np
import soundfile as sf
def run():
    # 使用with语法保证channel自动close
    with grpc.insecure_channel('localhost:50000') as channel:
        # 客户端通过stub来实现rpc通信
        stub = AirRecognitionServiceStub(channel)

        dir1 = "D:/work/pictures/1/9.jpg"
        dir2 = "D:/work/音频原始数据/10.wav"

        dir3 = "D:/work/pictures/1/1.jpg"
        sig, fs_rate = sf.read(dir2)
        sig=np.array(sig)
        # 客户端必须使用定义好的类型,这里是HelloRequest类型

        ML = stub.SVMAirRecognition(MLAirRequest(sig=sig,fs_rate=fs_rate))#机器学习SVM

        DL = stub.CNNAirRecognition(DLAirRequest(sig=sig,fs_rate=fs_rate))#深度学习

    print ("DL's result: " + DL.dlmessage)
    print("ML's result: " + ML.mlmessage)

if __name__ == "__main__":
    logging.basicConfig()
    run()

4.在AirRecognition_server.py中写

# @File  : AirRecognition_server.py
# @Author: Wang Zhimin
# @Date  :  2019/10/28

#!/usr/bin/env python
# -*-coding: utf-8 -*-

from concurrent import futures
import grpc
import logging
import time
import numpy as np
import tensorflow as tf
from scipy import signal
from scipy.fftpack import fft
import pickle
import CnnModel
import ModelSave
from config import Config
import cv2
from rpc_package.AirRecognition_pb2_grpc import add_AirRecognitionServiceServicer_to_server, \
    AirRecognitionServiceServicer
from rpc_package.AirRecognition_pb2 import MLAirReply,DLAirReply
from scipy.misc import imsave

class Air(AirRecognitionServiceServicer):

    # 这里实现我们定义的接口

    def SVMAirRecognition(self, request, context):
        sig=request.sig

        fs_rate=request.fs_rate
          "...........中间写实际函数............"
        return MLAirReply(mlmessage='Hello, %s.不是飞机' % label, )
        
    def CNNAirRecognition(self, request, context):
        sig=request.sig
        fs_rate=request.fs_rate   # sig为矩阵 fs_data=采样率
	"...........中间写实际函数............"
        return DLAirReply(dlmessage='Hello, %s.不是飞机' % label)
            

def serve():
    # 这里通过thread pool来并发处理server的任务
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

    # 将对应的任务处理函数添加到rpc server中
    add_AirRecognitionServiceServicer_to_server(Air(), server)

    # 这里使用的非安全接口,世界gRPC支持TLS/SSL安全连接,以及各种鉴权机制
    server.add_insecure_port('[::]:50000')
    server.start()
    try:
        while True:
            time.sleep(60 * 60 * 24)
    except KeyboardInterrupt:
        server.stop(0)


if __name__ == "__main__":
    logging.basicConfig()
    serve()

5.先启动AirRecognition_server
再启动AirRecognition_client

你可能感兴趣的:(python,grpc)