2012-01-16 64 views
6

我在考虑下一个项目的总体架构。对于后端,haskell看起来非常合适,但不适合前端,python会更好,可能更容易编码。大量的计算将在haskell中完成,结果显示在用python构建的gui中。在python和haskell进程之间进行通信的ipc库是什么?

所以,我需要选择合适的管道与这两个进程之间通信的正确的格式。

从蟒蛇送到Haskell的过程中的信息将是相当简单的,像有一些,但不同值的文档。 (JSON可用于我想。)

但是从哈斯克尔到Python进程的消息会更加重了很大的(浮动)阵列。这就是我需要更加小心的地方:我使用的任何库都需要在python中快速实现并且在haskell中相当稳定。

那么,有什么选择?

+0

您是否尝试过使用谷歌? – Marcin 2012-01-16 15:23:16

+0

是的,它没有给我有意义的结果。我认为这有三个原因是不可搜索的。首先,python和haskell之间的通信不是很常见。其次,很难看出什么是哈斯克尔生态系统中最好的库(我对它不是很熟悉)。第三,小消息的好处可能会或可能不适用于大数组在其中的消息。 – LBarret 2012-01-16 15:46:23

+0

真的吗?因为这个谷歌搜索在前五个结果中返回至少两个关于这个主题的网页:http://www.google.co.uk/search?q=haskell+python – Marcin 2012-01-16 16:29:30

回答

6

我使用谷歌的协议缓冲区超过zeromq在我们公司。它非常高兴地在Python,C++和C#代码之间洗牌数据,我也成功地与haskell玩过了。

从本质上讲,你可以拆分这分成两个问题,系列化和运输。

由于ehird提到他们的回答也有序列化了多种选项。我建议使用协议缓冲区了很多,但我听说过有关节俭的好消息,也有msgpack.org,这看起来很稳定。

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

+1

其实,我只是看着msgpack又和RPC东西看起来非常好。 RPC在使用python的protobuf中有点痛苦。 – 2012-01-17 12:48:54

+1

不幸的是,[hprotoc]包(http://hackage.haskell.org/package/hprotoc)没有导出任何模块,[protocol-buffers](http://hackage.haskell.org/package/protocol - 缓冲区)不会像最新版本那样构建;那些是我在Hackage上发现的唯一协议缓冲库。所以我不确定使用来自Haskell的协议缓冲区是否实际... – ehird 2012-01-17 16:36:04

+0

IIRC,当协议缓冲区lib被释放时,它在Python中非常慢(python lib是纯Python)。你知道这是否改变了吗?编辑:刚刚得到eihrd评论,我想这会排除pbuffers如果haskell版本没有更新。我会尝试联系lib维护者。 – LBarret 2012-01-17 19:17:32

5

我会考虑使用cerealblaze-builder包从哈斯克尔定义自己的二进制序列化格式,然后编写代码手动解压它在Python(例如使用struct)。如果你有很多结构需要传输,这可能会很痛苦,但是如果只有一两个结构,那么这可能比找到在这两种语言中得到很好支持的二进制序列化格式更紧凑和更简单。

谷物处理序列化和deserialisation,但杀出建设者只做系列化;另一方面,我认为大火建造者更快。谷物的主要目的是以一种你并不特别挑剔的格式来序列化某些东西,所以你可以稍后用Haskell读取它,这意味着它广泛地使用了一个类型类,所以你必须小心使用标准的序列化,串行化任意bignum Integer s而不是固定大小的整数,而大火建设者则更多地是关于自定义格式。尽管如此,使用定制格式的谷物还是很容易的,如果你想从Haskell中反序列化结构,这也是明显的选择。

在Hackage快速浏览示出了维护良好的BSON包;如果你的结构很复杂,那么这可能是一个不错的选择,否则可能会矫枉过正。

我认为使用JSON的Python→Haskell运输可能是最好的主意;虽然您没有两种方式使用相同序列化格式的精妙之处,但JSON是非常标准的,并且在Haskell中由aeson很好地支持。如果你选择Haskell→Python路由的BSON,那也可以。

  • 有两个用于Apache的节俭在Hackage容易混淆的名称的绑定:

    我能想到的其他选项Thriftthrift;似乎前者被弃用而赞成后者。但是,我并不了解Thrift,所以我不能说这是否有用。

  • 您可以在使用cpythonMissingPy(尽管后者似乎没有维护)的Haskell过程中使用embed the Python code
  • 您可以使用FFI从Haskell导出函数,然后使用ctypes从Python导入它们。
+1

我想你所指的包被称为“[ cpython](http://hackage.haskell.org/package/cpython)“,而不是”haskell-cpython“。 – dflemstr 2012-01-16 18:25:07

+0

@dflemstr:哦,谢谢。我链接的文章将其称为后者。 – ehird 2012-01-16 18:33:15

+0

我想避免第一个版本/原型的不必要的复杂性。嵌入(也可以用[cython](http://cython.org/)完成)增加了一层复杂性。 IPC和将这两个过程分开似乎对我来说更直接,并为其他前端敞开大门。 – LBarret 2012-01-17 19:26:21

相关问题