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

本文探讨了在C#中集成Python机器学习算法的实现,通过XML-RPC作为通讯框架。作者比较了GRPC和XML-RPC,并选择了XML-RPC因其简单易部署的特性。在C#端定义了接口,通过Python的SimpleXMLRPCServer实现服务端功能,包括预测、测试和自动化建模等方法。尽管格式转换和数据类型限制带来一定挑战,但这种方式为C#与Python的混合编程提供了可行方案。
摘要由CSDN通过智能技术生成

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
    {
        /// <summary>
        ///     Adds the numbers.
        /// </summary>
        /// <returns> Sum of the numbers .</returns>
        /// <param name="numberA"> Summand a.</param>
        /// <param name="numberB"> Summand b.</param>
        [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,等基本类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值