假設有興趣編寫python
應用程序,其中應該有不同進程之間的通信。通信將通過發送strings
和/或numpy
陣列完成。Python:OpenMPI VS. RabbitMQ
對於更喜歡OpenMPI
而不是像RabbitMQ
這樣的工具,有哪些考慮因素?
假設有興趣編寫python
應用程序,其中應該有不同進程之間的通信。通信將通過發送strings
和/或numpy
陣列完成。Python:OpenMPI VS. RabbitMQ
對於更喜歡OpenMPI
而不是像RabbitMQ
這樣的工具,有哪些考慮因素?
這樣的問題沒有單一的正確答案。這一切都取決於大量不同的因素。例如:
ZeroMQ
可能是最快的。如果您在一組主機上運行,則取決於可用的互連。例如。 OpenMPI可以使用infiniband/mirynet鏈接。這正是我在幾個月前的情景,我決定除了大型對象的memcache之外,還使用AMQP和RabbitMQ進行主題交換。
AMQP消息都是JSON對象格式的字符串,因此很容易爲消息添加屬性(如重試次數)並重新發布它。 JSON對象是與Python字典相對應的JSON的子集。例如{「recordid」:「272727」}是一個具有一個屬性的JSON對象。我本來可以醃製一個Python字典,但是這會將我們鎖定在只使用Python的消息隊列中。
的大型物體不要被AMQP路由,相反,他們進入一個內存緩存,他們可用於其他進程對它們進行檢索。你可以使用Redis或東京暴君來完成這項工作。我們的想法是,我們不希望短消息排在大對象後面。
最後,我的Python進程最終在架構的兩個不同方面使用了AMQP和ZeroMQ。您可能會發現,同時使用OpenMPI和AMQP對於不同類型的作業是有意義的。
在我的情況下,管理進程將永遠運行下去,開始工作人員的整個羊羣,除非他們死誰也永遠運行或掛起,在這種情況下,主管重新啓動它們。這項工作不斷通過AMQP作爲消息流入,每個流程只處理工作的一個步驟,因此當我們確定瓶頸時,我們可以在多臺機器上安裝多個流程實例,以消除瓶頸。在我的情況下,我有一個進程的15個實例,其他兩個中的4個,以及大約8個其他單個實例。
邁克爾,這是一個有趣的設計。感謝分享這個。 – user3262424
您還應該考慮_ [msgpack](http://msgpack.org/)_用於序列化,它與_zeromq_非常協調。 – errordeveloper
方丈,謝謝你的迴應。是的,我正在通過100臺機器的網絡發送「大數據包」(每個數據塊少數MB)我有一個簡單的1G網絡。沒有什麼花哨;可以有一點延遲 - 不一定是最快的。 – user3262424
+1。通常,MPI適合在多個可靠節點(例如,集羣中的節點或實驗室中的一堆PC)上運行單個大型任務。如上所述,當您不知道什麼類型的網絡具有,或者您想要利用節點上的內核之間的共享內存時,這也很棒。你從這種用例偏離的越遠,MPI越不適合。我只想補充一點,OpenMPI只是MPI的一個實現;另一個MPICH2也一樣好。如果你打算使用MPI + Python,我推薦mpi4py。 (http://mpi4py.scipy.org/) –
Jonathan,謝謝。有沒有使用OpenMPI和RabbitMQ的優勢? – user3262424