C# 和 CPython 之间的快速且可扩展的 RPC

Posted

技术标签:

【中文标题】C# 和 CPython 之间的快速且可扩展的 RPC【英文标题】:Fast and scalable RPC between C# and CPython 【发布时间】:2012-10-30 15:11:20 【问题描述】:

我需要一些关于 C# - 用于科学应用的 cPython 集成的反馈。

场景如下:用于数据采集和可视化的 C# - 用于数据操作的 CPython,使用多个和不断变化的第三方库来实现特定领域的任务。

一般用例:

    C# 代码从设备获取实时数据 C#代码将数据传递给cPython代码并请求详细说明 Cpython 代码创造奇迹 Cpython 代码将结果传回 C# 代码 C# 在 WPF 应用程序中可视化数据

c# 和 cPython 代码(项目 1)、3)和 5))都已经针对速度进行了优化。 双向传递的数据(第 2 项和第 4 项)本质上是 10E6 双精度数组 (不涉及复杂的数据结构)。

我想找到一个性能良好的接口解决方案(从 1 到 5 的速度) 和解耦功能,也最大限度地减少了客户端的开发(c# 代码) 边。 实际上双方都在同一台机器上运行,但我希望解决方案可以横向扩展。

我尝试过的解决方案 - 问题:

a) C# + 在 .NET 上移植 python 算法 - 编写/重写的代码太多 在领域方面,缺乏 cPython 为科学方面几乎所有内容提供的专门库 b) C# 在托管代码上嵌入 ironpython + 包装/移植 c++ 扩展(有和没有ironclad) - 算法执行期间使用的结构的编组导致的临界性能 - 升级子组件版本时的 dll 地狱。 c) 在 ironpython 和 python 之间嵌入 ironpython + rpc - 可维护性问题, 不满足于在三个 C#/ironpython/python 之间“传递”数据。 d) XML-RPC、JSON-RPC - 性能(速度)不满意。

我计划评估的尚未尝试的解决方案:

e) Apache Thrift f)ZeroRPC

提前感谢任何批评、cmets 和建议。

【问题讨论】:

将 python 部分作为服务运行并使用 HTTP 为它提供一个接口选项? @Filippo:您能否详细说明您正在处理什么样的数据(结构..)以及您是否希望实施/有多少不同的操作以及结果如何。如果您只想进行二进制输入/输出,JSON/XML+HTTP 可能对您没有任何好处。如果它是一个单一的、特定的操作并返回二进制文件,你可以只使用套接字/管道。 Iboshuizen:我已经尝试过基于 HTTP 的 XML-RPC 和 JSON-RPC,除了速度(主要帖子的第 2 点和第 4 点)之外,它们在所有方面都很完美,所以我猜它最好尝试其他解决方案。 @Simon:典型的用例是将一个大型(10E6)双精度浮点(64位)数组作为输入并返回一个相同维度的双精度数组作为输出的函数。我需要实现很多具有相似符号的功能,这就是为什么我正在寻找一个高效的 rpc 协议。另一方面,插座在性能方面还可以,但设计无法扩展。 【参考方案1】:

我有一个类似的需求(C#Python RPC)我刚刚尝试了 Apache Thrift,印象非常深刻。它非常快:比 Pyro4/pickle 慢 50%,比 RPyC 快 5 倍。这是为了将 numpy 数组作为二进制数据发送。 Thrift 的剩余开销可能是将数组数据复制到字符串中/从字符串中复制出来。如果可以重构 Thrift 以使用缓冲区对象代替字符串,我希望它与 Pyro 一样快。

代码生成看起来很干净,API 也很好。它缺少的主要是文档。尽管如此,我还是能够从基本教程、测试和浏览源代码中弄清楚一切。

据我所知 ZeroRPC 还没有 C# 实现。

【讨论】:

以上是关于C# 和 CPython 之间的快速且可扩展的 RPC的主要内容,如果未能解决你的问题,请参考以下文章

Python3快速入门(十七)——Python扩展模块开发

简单且可扩展的图神经网络

机器学习模型持久性选项

CPython 是不是允许在 Windows 10 中的 C# 中导入 OpenCV 和 Tesseract-OCR?

从 Go 调用 CPython 扩展

从 C 扩展跟踪 CPython 对象的生命周期