2016-02-26 161 views
5

我有2個代碼庫,一個在python中,一個在C++中。我想在他們之間分享實時數據。我想評價哪些選項最適合我的具體使用情況:在Python代碼和C++代碼之間共享信息(IPC)

  • 許多小數據從C++程序的Python程序
  • 更新他們在同一臺機器上都運行
  • 可靠性是非常重要的
  • 低延遲是好的,有

我可以看到幾個選項:

  • 一個進程寫入一個平面文件,另一個進程讀取它。它不可擴展,速度慢,I/O容易出錯。
  • 一個進程寫入數據庫,另一個進程讀取它。這使得它更具可擴展性,稍微不易出錯,但仍然非常慢。
  • 將我的Python程序嵌入到C++中或其他方式。我拒絕了這個解決方案,因爲兩個代碼庫都相當複雜,爲了維護性的原因,我最好讓它們保持分離。
  • 我在兩個程序中都使用了一些套接字,並直接發送消息。這似乎是一種合理的方法,但並沒有利用它們在同一臺機器上的事實(它將通過使用本地主機作爲目的地而略微優化,但仍然感到麻煩)。
  • 使用共享內存。到目前爲止,我認爲這是我找到的最令人滿意的解決方案,但缺點是實施稍微複雜一些。

還有沒有其他的解決方案,我應該考慮?

+0

直接使用C++/Python中的Python/C++代碼? –

+0

RESTful API應該對你最有幫助,完美的獨立語言api – AlokThakur

+0

@Revolver_Ocelot,我擁有2個代碼庫,所以是的,我可以直接在每個代碼中使用代碼。 – DevShark

回答

1

首先,這個問題是非常基於意見的!

最乾淨的方法是在同一個進程使用他們,並讓他們直接溝通。唯一的複雜性是實現適當的API和C++ - > Python調用。缺點是你記下的可維護性和潛在的較低健壯性(兩者一起崩潰,在大多數情況下不是問題)和較低的靈活性(你確定你永遠不需要在不同的機器上運行它們)。可擴展性是最好的,因爲添加更多通信或更改現有非常簡單。您可以重新考慮可維護性點。你可以用Python的應用程序不使用C++對應?如果沒有,我不會擔心可維護性這麼多。

然後共享內存是具有更好的可維護性但其他缺點相同的下一個選擇。可擴展性稍微差一些,但還不算太糟糕。它可能很複雜,我不知道Python支持共享內存操作,對於C++你可以看看Boost.Interprocess。我首先要檢查的主要問題是進程之間的同步。

然後,網絡通信。這裏有很多選擇,從套接字級別實現的最簡單的二進制協議到評論中提到的更高級別的選項。這取決於你的C++ < - > Python通信是多麼複雜,並且可以在未來。這種方法實施起來可能更復雜,可能需要第三方庫,但一旦完成,它就具有可擴展性和靈活性。通常第三方庫基於代碼生成(Thrift,Protobuf),不會簡化構建過程。

我不會認真考慮這種情況下的文件系統或數據庫。

+0

在這種情況下,「適當的API」是什麼?我不明白。他們是不同的應用程序 – Andrey

+0

我的意思是你想從C++端調用的API,它可以是任何你需要的,但更好的是把它保存在一個地方,像façade模式(https://en.wikipedia.org/wiki/ Facade_pattern),用於無痛維護。無論您選擇什麼選項,這樣的API都可以。 –