Когда использовать gen_server в приложениях Erlang / OTP - PullRequest
13 голосов
/ 01 сентября 2009

Прочитав книгу Джо Армстронга и просмотрев скриншоты Кевина Смита, я создал простое OTP-приложение, состоящее из одного gen_server и одного супервизора, связанных вместе как OTP-приложение.

Сейчас я смотрю на mochiweb и создал пример проекта [helloworld], используя скрипт new_mochiweb.erl. Просматривая исходный код, я вижу, что он не отличается от моего примера приложения OTP [приложение OTP есть, там есть супервизор] с одним ключевым отличием: сгенерированные файлы helloworld.erl и helloworld_web.erl не реализуют поведение gen_server, это просто стандартные модули Erlang.

У меня сложилось впечатление, что использование gen_server было рекомендованным способом при создании компонентов приложения OTP. Почему mochiweb может использовать OTP-приложения и поведение супервизора, а не gen_server?

Ответы [ 2 ]

10 голосов
/ 01 сентября 2009

Вы используете OTP / gen_servers для процессов, которые находятся под стратегией перезапуска - , то есть перезапуск их находится под вашим контролем .

Это не относится к процессам, представляющим подключения к веб-браузерам. Если этот процесс умирает, сервер не может его перезапустить - поэтому запускать его под OTP бессмысленно.

Mochiweb (и Yaws) оба используют gen_servers для привязки к порту прослушивания, а затем запускают неконтролируемый процесс для обработки нового соединения.

4 голосов
/ 01 сентября 2009

Существует gen_server, называемый mochiweb_socket_server. Сгенерированные модули являются только «модулями обратного вызова» для gen_server, который вызывается при получении входящего запроса.

...