LBa*_*ret 6 python architecture haskell ipc
我正在考虑下一个项目的总体架构.对于后端,haskell看起来非常合适,但不适用于前端,其中python会更好并且更容易编码.繁重的计算将在haskell中完成,结果显示在用python构建的gui中.
所以,我需要选择正确的管道和正确的格式来在这两个过程之间进行通信.
从python发送到haskell进程的消息非常简单,就像具有一些但不同值的文档一样.(我想可以使用json.)
但是从haskell到python进程的消息对于大(浮点)数组会更加沉重.这就是我需要更加小心的地方:无论使用哪种库,都需要在python中实现快速实现,并且在haskell中要相当稳定.
那么,有哪些选择?
我在我们公司使用谷歌的协议缓冲区而不是zeromq.很高兴在python,C++和C#代码之间改变数据,我也成功地使用了haskell.
基本上你可以把它分成两个问题,序列化和传输.
正如第三提到他们的答案,序列化有很多选择.我建议使用协议缓冲区很多,但我听说过有关节俭的好东西,而且还有msgpack.org,这看起来非常可靠.
运输明智我推荐zeromq,它太棒了!它支持各种各样的消息传递模式,并且它快速尖叫.以下是管道库的zmq Resources和Sinks的一个小例子(我还没有发布):https: //github.com/boothead/zeromq-conduit
我会考虑使用Haskell中的cereal或blaze-builder软件包来定义你自己的二进制序列化格式,然后编写代码以手动解压缩它(例如使用struct).如果要传输大量结构,这可能会很痛苦,但如果只有一个或两个,那么这可能比找到两种语言都支持的二进制序列化格式更紧凑,更简单.
谷物处理序列化和反序列化,但是blaze-builder只进行序列化; 另一方面,我认为火焰建造者更快.谷歌的主要目的是以一种你不是特别挑剔的格式来串行化,所以你可以稍后用Haskell阅读它,这意味着它广泛使用类型类,所以你必须小心使用标准的序列化,这些行为会产生诸如序列化任意bignum Integer而不是固定大小的整数,而blaze-builder更多地是关于自定义格式.尽管如此,使用自定义格式的谷物非常容易,如果你想从Haskell反序列化结构,那么这是显而易见的选择.
快速浏览Hackage可以看到一个维护良好的BSON软件包; 如果您的结构很复杂,那么这可能是一个不错的选择,但在其他方面可能会有点过分.
我认为使用JSON进行Python→Haskell传输可能是最好的想法; 虽然你失去了同时使用相同序列化格式的精确性,但JSON非常标准,并且在Hesell中得到了很好的支持.如果您为Haskell→Python路线选择BSON,那也可以.
我能想到的其他选择:
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |