什么是在python和haskell进程之间进行通信的ipc库?

LBa*_*ret 6 python architecture haskell ipc

我正在考虑下一个项目的总体架构.对于后端,haskell看起来非常合适,但不适用于前端,其中python会更好并且更容易编码.繁重的计算将在haskell中完成,结果显示在用python构建的gui中.

所以,我需要选择正确的管道和正确的格式来在这两个过程之间进行通信.

从python发送到haskell进程的消息非常简单,就像具有一些但不同值的文档一样.(我想可以使用json.)

但是从haskell到python进程的消息对于大(浮点)数组会更加沉重.这就是我需要更加小心的地方:无论使用哪种库,都需要在python中实现快速实现,并且在haskell中要相当稳定.

那么,有哪些选择?

Ben*_*ord 6

我在我们公司使用谷歌的协议缓冲区而不是zeromq.很高兴在python,C++和C#代码之间改变数据,我也成功地使用了haskell.

基本上你可以把它分成两个问题,序列化和传输.

正如第三提到他们的答案,序列化有很多选择.我建议使用协议缓冲区很多,但我听说过有关节俭的好东西,而且还有msgpack.org,这看起来非常可靠.

运输明智我推荐zeromq,它太棒了!它支持各种各样的消息传递模式,并且它快速尖叫.以下是管道库的zmq Resources和Sinks的一个小例子(我还没有发布):https: //github.com/boothead/zeromq-conduit


ehi*_*ird 5

我会考虑使用Haskell中的cerealblaze-builder软件包来定义你自己的二进制序列化格式,然后编写代码以手动解压缩它(例如使用struct).如果要传输大量结构,这可能会很痛苦,但如果只有一个或两个,那么这可能比找到两种语言都支持的二进制序列化格式更紧凑,更简单.

谷物处理序列化和反序列化,但是blaze-builder只进行序列化; 另一方面,我认为火焰建造者更快.谷歌的主要目的是以一种你不是特别挑剔的格式来串行化,所以你可以稍后用Haskell阅读它,这意味着它广泛使用类型类,所以你必须小心使用标准的序列化,这些行为会产生诸如序列化任意bignum Integer而不是固定大小的整数,而blaze-builder更多地是关于自定义格式.尽管如此,使用自定义格式的谷物非常容易,如果你想从Haskell反序列化结构,那么这是显而易见的选择.

快速浏览Hackage可以看到一个维护良好的BSON软件包; 如果您的结构很复杂,那么这可能是一个不错的选择,但在其他方面可能会有点过分.

我认为使用JSON进行Python→Haskell传输可能是最好的想法; 虽然你失去了同时使用相同序列化格式的精确性,但JSON非常标准,并且在Hesell中得到了很好的支持.如果您为Haskell→Python路线选择BSON,那也可以.

我能想到的其他选择:

  • Apache Thrift on Hackage有两个令人困惑的命名绑定:Thriftthrift ; 似乎前者被弃用而有利于后者.我对Thrift一无所知,所以我不能说这是否有用.
  • 你可以嵌入Python代码使用Haskell的过程中CPython的MissingPy(尽管后者似乎没有被维护).
  • 您可以使用FFI从Haskell导出函数,然后使用ctypes从Python导入它们.