Когда использовать Gen_Fsm и когда использовать Gen_Server?

После проверки документов Gen_Fsm и Gen_Server я обнаружил, что более или менее они действуют как аналогичное поведение. На мой взгляд, если есть одна функция цикла для отправки вещания или прослушивания tcp sock, лучше использовать 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.