2014-10-31 58 views
0

所以我們通用的部分和特定的部分都歸功於erlang/OTP行爲,這大大簡化了我們的代碼,併爲我們提供了一個每個人都能理解的通用框架。應該執行哪些行爲?

我是Erlang的新手,並試圖讓我的頭腦圍繞OTP的概念。 但當中

  • gen_server
  • 的gen_fsm
  • gen_event
  • 主管

其行爲適用於什麼樣的應用。

我之所以問這個問題,是因爲經過一些詳細的理論後,我仍然不確定哪個更適合XYZ應用。

是否有任何標準或經驗法則,還是隻是程序員本能在這種情況下的本能? 有什麼幫助嗎?

回答

1

備註,這是一個非常普遍的問題,不適合使用這個社區。

主管在這裏控制應用程序啓動和演變的方式。 它以正確的順序啓動進程,並驗證一切正常,管理失敗時的重啓策略,進程池,監督樹......優點是它可以幫助您按照「讓它崩潰」規則在您的應用程序中,它將精力集中在幾行代碼中,以協調您的所有流程。

我使用gen_event主要用於記錄目的。您可以使用此行爲根據您的目標按需連接不同的處理程序。在我的一個應用程序中,我默認有一個圖形記錄器,允許一眼查看行爲,以及一個文本文件處理程序,可以進行更深入的事後分析。

Gen_server是所有應用程序的基本磚塊。它允許保持狀態,在通話中響應,投射甚至簡單的信息。它管理代碼更改並提供啓動和停止的功能。我的大部分模塊都是gen_servers,你可以將它看作是負責執行單個任務的actor。

Gen_fsm爲gen server帶來了具有特定行爲的當前狀態的概念,以及從狀態到狀態的轉換。它可用於例如在遊戲中控制遊戲的進化(配置,等待玩家,玩,改變等級......)

當你創建一個應用程序時,你將識別你必須做的不同任務並將它們分配給gen_server或gen_fsm。您將添加gen_event以允許發佈/訂閱機制。然後,您將必須將所有進程分組,考慮其依賴性和錯誤恢復。這會給你監督樹和重啓策略。

0

我使用以下規則。

  • 如果您有一些長期生活的實體以請求 - 響應的方式爲多個客戶提供服務 - 您使用gen_server
  • 如果這個長期生存的實體應該支持更復雜的協議,只是要求/響應,那麼使用gen_fsm是個好主意。例如,我喜歡使用gen_fsm來實現網絡協議。
  • 如果您需要一些抽象事件總線,任何進程都可以發佈消息,並且任何客戶端可能都希望收到此消息,則需要gen_event
  • 如果您有一些必須一起重新啓動的過程(例如,如果其中一個過程失敗),您應該將此過程置於supervisor之下,從而將這些過程聯繫在一起。
相關問題