2011-07-20 41 views
5

假設有興趣編寫python應用程序,其中應該有不同進程之間的通信。通信將通過發送strings和/或numpy陣列完成。Python:OpenMPI VS. RabbitMQ

對於更喜歡OpenMPI而不是像RabbitMQ這樣的工具,有哪些考慮因素?

回答

12

這樣的問題沒有單一的正確答案。這一切都取決於大量不同的因素。例如:

  1. 你有什麼樣的通信?您是否正在發送大包或小包,您是否需要良好的帶寬或低延遲?
  2. 您需要什麼樣的交付保證?
  3. OpenMPI可以將消息僅發送給正在運行的進程,而不同的MQ解決方案可以對消息進行排隊並允許花哨的生產者 - 使用者配置。
  4. 你有什麼樣的網絡?如果你在本地主機上運行,​​類似ZeroMQ可能是最快的。如果您在一組主機上運行,​​則取決於可用的互連。例如。 OpenMPI可以使用infiniband/mirynet鏈接。
  5. 你在做什麼樣的處理?通過MPI,所有進程通常同時啓動,執行處理並立即全部終止。
+0

方丈,謝謝你的迴應。是的,我正在通過100臺機器的網絡發送「大數據包」(每個數據塊少數MB)我有一個簡單的1G網絡。沒有什麼花哨;可以有一點延遲 - 不一定是最快的。 – user3262424

+0

+1。通常,MPI適合在多個可靠節點(例如,集羣中的節點或實驗室中的一堆PC)上運行單個大型任務。如上所述,當您不知道什麼類型的網絡具有,或者您想要利用節點上的內核之間的共享內存時,這也很棒。你從這種用例偏離的越遠,MPI越不適合。我只想補充一點,OpenMPI只是MPI的一個實現;另一個MPICH2也一樣好。如果你打算使用MPI + Python,我推薦mpi4py。 (http://mpi4py.scipy.org/) –

+0

Jonathan,謝謝。有沒有使用OpenMPI和RabbitMQ的優勢? – user3262424

4

這正是我在幾個月前的情景,我決定除了大型對象的memcache之外,還使用AMQP和RabbitMQ進行主題交換。

AMQP消息都是JSON對象格式的字符串,因此很容易爲消息添加屬性(如重試次數)並重新發布它。 JSON對象是與Python字典相對應的JSON的子集。例如{「recordid」:「272727」}是一個具有一個屬性的JSON對象。我本來可以醃製一個Python字典,但是這會將我們鎖定在只使用Python的消息隊列中。

的大型物體不要被AMQP路由,相反,他們進入一個內存緩存,他們可用於其他進程對它們進行檢索。你可以使用Redis或東京暴君來完成這項工作。我們的想法是,我們不希望短消息排在大對象後面。

最後,我的Python進程最終在架構的兩個不同方面使用了AMQP和ZeroMQ。您可能會發現,同時使用OpenMPI和AMQP對於不同類型的作業是有意義的。

在我的情況下,管理進程將永遠運行下去,開始工作人員的整個羊羣,除非他們死誰也永遠運行或掛起,在這種情況下,主管重新啓動它們。這項工作不斷通過AMQP作爲消息流入,每個流程只處理工作的一個步驟,因此當我們確定瓶頸時,我們可以在多臺機器上安裝多個流程實例,以消除瓶頸。在我的情況下,我有一個進程的15個實例,其他兩個中的4個,以及大約8個其他單個實例。

+0

邁克爾,這是一個有趣的設計。感謝分享這個。 – user3262424

+0

您還應該考慮_ [msgpack](http://msgpack.org/)_用於序列化,它與_zeromq_非常協調。 – errordeveloper