После проверки документов Gen_Fsm и Gen_Server я обнаружил, что более или менее они действуют как аналогичное поведение. На мой взгляд, если есть одна функция цикла для отправки вещания или прослушивания tcp sock, лучше использовать Gen_Fsm или использовать gen_server. Я хочу знать, правильно ли это?
Когда использовать Gen_Fsm и когда использовать Gen_Server?
Ответ 1
Вы правильно заметили, что gen_server
и gen_fsm
очень похожи по функциональности.
Однако в большинстве программ гораздо больше gen_server
, чем gen_fsm
.
По-моему, gen_fsm
полезен только тогда, когда использование 100% соответствует модели gen_fsm. Таким образом, должен быть простой и понятный конечный автомат, который подходит для вашей проблемы. Имейте в виду, что, как правило, количество состояний FSM имеет тенденцию взорваться перед лицом реального мира.
Если вы обнаружите, что в переменной gen_fsm
State
имеется много информации о состоянии состояния, вероятно, время для переключения на gen_server
и добавить состояние gen_fsm
к переменной State
.
Обычно, когда вы сомневаетесь: используйте gen_server
Одним из недостатков как gen_server
, так и gen_fsm
(что обычно бывает хуже в gen_fsm
), является то, что вы не можете использовать выборочный прием. Селективный прием является важным инструментом для снижения сложности состояний в реальных приложениях.
Чтобы иметь преимущество как выборочного приема, так и поведения OTP, я бы рекомендовал plain_fsm.