2011-06-01 62 views
10

檢查Gen_Fsm和Gen_Server文檔後,我發現或多或少,它們的行爲類似。在我看來,如果有一個循環函數用於發送廣播或監聽tcp sock,最好使用Gen_Fsm,否則使用gen_server。我想知道它是否正確?何時使用Gen_Fsm以及何時使用Gen_Server?

回答

9

你已經看到正確的gen_servergen_fsm功能非常相似。

但是在大多數程序中有更多gen_servergen_fsm的用法。

在我看來,gen_fsm僅當使用率100%適合gen_fsm模型時纔有用。所以必須有一個簡單明瞭的有限狀態機來適應你的問題。請注意,通常情況下,密克羅尼西亞聯邦的國家數量在面對現實世界時會發生爆炸。

如果你發現自己有很多的輔助狀態信息gen_fsmState可變它可能是時間切換到gen_server並添加gen_fsm的狀態到State變量。

一般當有疑問:同時使用gen_servergen_fsmgen_server

一個缺點(它出來,在gen_fsm通常更糟)是你不能使用選擇性接收。選擇性接收是降低實際應用中狀態機複雜度的重要工具。

爲了兼顧選擇性接收和OTP行爲,我推薦使用plain_fsm

+0

你說:「......你不能使用選擇性接收。」,這是爲什麼?我認爲,只要我們不觸及那些我們不感興趣的消息,比如'$ gen_blah_blah'和系統消息,我們都很好。如果我們可以控制傳入消息的格式,那麼我們只能接收到我們感興趣的內容,比如'receive {some_app_specific_message_tag,Msg} - > ...' – 2016-09-18 06:25:56

+0

@NotanID那麼您將不得不在'handle_info' ,並且不能使用'gen_server:call | cas​​t'。此時,plain_fsm是更好的選擇。 – niahoo 2017-02-02 09:27:15

相關問題