檢查Gen_Fsm和Gen_Server文檔後,我發現或多或少,它們的行爲類似。在我看來,如果有一個循環函數用於發送廣播或監聽tcp sock,最好使用Gen_Fsm,否則使用gen_server。我想知道它是否正確?何時使用Gen_Fsm以及何時使用Gen_Server?
10
A
回答
9
你已經看到正確的gen_server
和gen_fsm
功能非常相似。
但是在大多數程序中有更多gen_server
比gen_fsm
的用法。
在我看來,gen_fsm
僅當使用率100%適合gen_fsm模型時纔有用。所以必須有一個簡單明瞭的有限狀態機來適應你的問題。請注意,通常情況下,密克羅尼西亞聯邦的國家數量在面對現實世界時會發生爆炸。
如果你發現自己有很多的輔助狀態信息gen_fsm
的State
可變它可能是時間切換到gen_server
並添加gen_fsm
的狀態到State
變量。
一般當有疑問:同時使用gen_server
和gen_fsm
的gen_server
一個缺點(它出來,在gen_fsm
通常更糟)是你不能使用選擇性接收。選擇性接收是降低實際應用中狀態機複雜度的重要工具。
爲了兼顧選擇性接收和OTP行爲,我推薦使用plain_fsm。
相關問題
- 1. 何時使用==以及何時使用?
- 2. 何時使用belongsTo以及何時hasMany?
- 3. 何時使用jQuery.ajax以及何時使用jQuery.post?
- 4. 何時使用Apache Helix以及何時使用Apache Mesos
- 5. 何時使用Abstract Factory以及何時使用Factory Method?
- 6. 何時使用LEFT JOIN以及何時使用INNER JOIN?
- 7. PHP:何時使用Traits以及何時使用靜態方法?
- 8. 何時使用Value Formatter以及何時使用Value Resolver
- 9. 何時使用json文件以及何時使用js文件?
- 10. 何時使用:something =>'something'以及何時使用:something,'something'?
- 11. Elixir:何時使用'數字'以及何時使用'整數'
- 12. 何時使用Class.isInstance()以及何時使用instanceof運算符?
- 13. 何時使用Socket以及何時在Flex中使用XMLSocket?
- 14. 何時使用以及何時不使用Python 2.7_中的__init__
- 15. 何時使用undef_method以及何時使用remove_method?
- 16. 何時使用ICommand包裝RelayCommand以及何時使用Just ReplayCommand?
- 17. 何時使用Core Data以及何時使用Sqlite?
- 18. 何時使用數組以及何時使用單元陣列?
- 19. 何時使用DataTrigger以及何時使用Converter?
- 20. 何時使用Docker-Compose以及何時使用Docker-Swarm
- 21. 何時使用dup以及何時在Ruby中使用克隆?
- 22. 何時使用佈局以及何時使用活動?
- 23. 何時使用IDataReader以及何時使用DataReader?
- 24. 何時使用uid以及何時在$ $ $ $中使用$ id
- 25. 何時使用ASP.NET驗證控件以及何時不使用?
- 26. 何時使用Pig以及何時使用Java for Mapreduce?
- 27. 何時使用Comparator以及何時在Java中使用Comparable?
- 28. 何時使用Twitter Bootstrap以及何時使用HTML5 Boilerplate?
- 29. 何時使用node.js以及何時使用ajax?
- 30. 何時使用json以及何時使用jquery $ .ajax進行jsonp?
你說:「......你不能使用選擇性接收。」,這是爲什麼?我認爲,只要我們不觸及那些我們不感興趣的消息,比如'$ gen_blah_blah'和系統消息,我們都很好。如果我們可以控制傳入消息的格式,那麼我們只能接收到我們感興趣的內容,比如'receive {some_app_specific_message_tag,Msg} - > ...' – 2016-09-18 06:25:56
@NotanID那麼您將不得不在'handle_info' ,並且不能使用'gen_server:call | cast'。此時,plain_fsm是更好的選擇。 – niahoo 2017-02-02 09:27:15