Ответ 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.