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我的文件部署是 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