使用rpc进行python和C#的传参通讯

0.前言

公司业务需要集成机器学习算法到上位机软件中,将仪器采集到的谱图和分析得到的数据进行建模,在新的样本到来时,进行目标值的预测。在大批量、检测精度要求不高、检测速度快的场合具有较高应用价值。C#在传统工控行业应用案例较多,机器学习主要用python语言。将python和C#混合编程在算法落地方面具有重要意义。

1.通讯方式

C#调用python代码主要有脚本调用、RPC远程调用、借助pythonnet库调用。脚本调用主要就是通过控制台启动python脚本,通过arg传入参数,之后再获取打印的字符,转化为我们需要的结果。缺点是可传递的参数有限、调用开销较大,使用场景有限。本文主要调研了三个RPC框架,分别是 GRPC,XMLRPC。其中 GRPC 是由 google开发的高性能通用的开源 RPC框架,主要面向移动应用开发目基于 HTTP/2协议标准而设计,支持大多数流行的编程语言。缺点是功能复杂,调用困难,框架占用体积较大,在小型软件中部署比较麻烦。XML-RPC 是基于 XII标准的RPC 协议,在 C#端Horizon XmlRpc 通讯包,Python 自带 SimpleXMLRPC 通讯包。现有XML-RPC协议较为简单,易于部署。综合比较,选择XML-RPC作为通讯框架。

2.C#代码

详细代码

    public interface IAddServiceProxy:IXmlRpcProxy, IPredict
    {
    }

    public interface IPredict
    {
        /// 
        ///     Adds the numbers.
        /// 
        ///  Sum of the numbers .
        ///  Summand a.
        ///  Summand b.
        [XmlRpcMethod("Server.Predict")]
        XmlRpcStruct Predict(double[] xAxis, double[] val);

        [XmlRpcMethod("Server.Test")]
        string Test(string input);


        [XmlRpcMethod("Server.AutoModeling")]
        string AutoModeling(string sampleInfo);
    }

创建RPC Client

_proxy = XmlRpcProxyGen.Create<IAddServiceProxy>();
_proxy.Url = textBox1.Text;

4.python代码

def rpc_predict(xAyyay:[],yArray:[]) -> dict:
    print('start measure')
    data=np.array([xAyyay,yArray],dtype='float64')
    predicts=Predict(data=data).predict_values()
    result=dict()
    for k,v in predicts.items():
        result[str(k)]=str(v)
    return result


if __name__ == '__main__':
    server = SimpleXMLRPCServer(('localhost', 666))
    server.register_function(rpc_predict, "getHelloWorld")
    print('services start!')
    server.serve_forever()

感想,这里的格式转换是个很麻烦的问题,只能传输double格式的数据,float是不行的,另外返回结果最好也是字符串化。数据格式支持string,int,double,数组,XmlRpcStruct,等基本类型。

你可能感兴趣的:(python,C#WinForm,python)