python和haskell进程之间通信的ipc LIB是什么?

python和haskell进程之间通信的ipc LIB是什么?,python,haskell,architecture,ipc,Python,Haskell,Architecture,Ipc,我正在考虑下一个项目的总体架构。对于后端,haskell看起来非常适合,但对于前端,python可能会更好,而且可能更容易编写代码。繁重的计算将在haskell中完成,结果将显示在用python构建的gui中 因此,我需要选择正确的管道和正确的格式来在这两个过程之间进行通信 从python发送到haskell进程的消息将非常简单,就像一个包含少量但不同值的文档一样。(我想json可以用于此目的。) 但是,如果使用大(浮点)数组,从haskell到python进程的消息将更加繁重。这就是我需要更加

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

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

从python发送到haskell进程的消息将非常简单,就像一个包含少量但不同值的文档一样。(我想json可以用于此目的。)

但是,如果使用大(浮点)数组,从haskell到python进程的消息将更加繁重。这就是我需要更加小心的地方:无论我使用什么libs,都需要在python中有一个快速的实现,并且在haskell中相当稳定


那么,有哪些选择呢

> P>我会考虑使用Haskell的OR包来定义自己的二进制序列化格式,然后编写代码以Python手动解包(例如使用)。如果有很多结构需要传输,这可能会很痛苦,但是如果只有一个或两个结构,那么这可能比找到两种语言都支持的二进制序列化格式更紧凑、更简单

谷物处理序列化和反序列化,但blaze builder只处理序列化;另一方面,我认为blaze builder更快。谷类的主要用途是以一种你并不特别挑剔的格式序列化某些东西,以便你以后可以用Haskell读回,这意味着它广泛使用类型类,因此,在使用标准序列化时必须小心,因为标准序列化会执行一些不需要的操作,例如序列化任意bignum
Integer
s,而不是固定大小的整数,而blaze builder更多的是定制格式。尽管如此,使用定制格式的谷物还是很容易的,如果您也想从Haskell反序列化结构,这是一个显而易见的选择

快速浏览一下Hackage就会发现一个维护良好的包;如果您的结构很复杂,那么这可能是一个很好的选择,但在其他情况下可能会有些过头

我认为在Python中使用JSON→哈斯克尔交通可能是最好的主意;虽然您失去了两种方式使用相同序列化格式的精确性,但JSON是非常标准的,并且在Haskell中得到了很好的支持。如果您为Haskell选择BSON→Python路线,这也可以

我能想到的其他选择:

  • Apache Thrift在Hackage上有两个名称混乱的绑定:和;似乎前者正在被弃用,取而代之的是后者。不过,我对节俭一无所知,所以我不能说这是否有用
  • 您可以在Haskell流程中使用or(尽管后者似乎没有维护)
  • 您可以使用FFI从Haskell导出函数,然后使用从Python导入它们

我在我们公司使用谷歌的zeromq协议缓冲区。很高兴在Python、C++和C代码之间进行数据转换,我也成功地和Haskell玩过了。 基本上,您可以将其分为两个方面,序列化和传输

正如ehird提到的答案一样,序列化有多种选择。我建议协议缓冲区经常使用它,但我听说过节约的好东西,还有msgpack.org,它看起来很可靠

在交通方面,我推荐zeromq,它太棒了!它支持各种各样的消息传递模式,而且速度非常快。下面是导管库的zmq资源和接收器的一个小示例(我还没有发布):

是的,它没有给我任何有意义的结果。我认为它不太容易搜索,原因有三。首先,python和haskell之间的通信不是很常见。其次,很难看出haskell生态系统中最好的LIB是什么(我不太熟悉)。第三,对于小消息来说什么是足够好的,对于包含大数组的消息来说可能有效,也可能无效。真的吗?因为谷歌搜索在前五个结果中至少返回了两个关于这个主题的页面:@Marcin:这里只有一个,整个页面上只有三个;然而,它们都是关于绑定/嵌入解决方案的,而这个问题主要是关于IPC的序列化格式。我认为这种敌意是没有道理的;这是一个合理的问题,有各种各样的可能答案。@ehird:问是合理的,但也有很多人提出的问题,他们甚至懒得做最基本的研究。这是不值得鼓励的。@Marcin:好吧,既然你链接到的谷歌结果都没有直接相关,而且莱昂内尔说他们确实先尝试过搜索,我不确定你还期待什么样的额外研究;我尝试过其他一些搜索,但它们没有发现太多的相关性,而且绝对不像是可用解决方案之间的比较。我认为您指的包名为“”,而不是“haskell cpython”。@dflemstr:哦,谢谢;我链接的文章称之为后者。我希望避免第一个版本/原型不必要的复杂性。嵌入(也可以使用)增加了一层复杂性。IPC和保持两个进程分开对我来说似乎更简单,并为其他前端打开了大门。(记录:你的答案和上面的Ben一样好,但我只能分配一次)事实上,我只是再次查看了msgpack,RPC的东西看起来非常好。RPC在python的protobuf中有点痛苦。不幸的是,该包没有导出任何模块,并且没有按照最新版本进行构建;这些是我在Hackage上找到的唯一的协议缓冲库。所以我不确定使用Haskell的协议缓冲区是否可行…IIRC,当协议