2012-01-16 71 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

相關問題