2009-08-31 9 views
12

Po przeczytaniu książki Joe Armstronga i obejrzeniu screencastów Kevina Smitha, stworzyłem prostą aplikację OTP składającą się z jednego serwera gen_ i pojedynczego nadzorcy, połączonego razem jako aplikacja OTP.Kiedy używać serwera gen_server w aplikacjach Erlang/OTP

Teraz patrzę na mochiweb i stworzyłem przykładowy projekt [hellow world] przy użyciu skryptu new_mochiweb.erl. Przeglądanie kodu źródłowego Widzę, że nie różni się od mojej przykładowej aplikacji OTP [aplikacja OTP tam jest, nadzorca tam jest] z jedną kluczową różnicą .. wygenerowane pliki helloworld.erl i helloworld_web.erl nie implementują zachowania gen_server, są tylko standardowymi modułami Erlanga.

Miałem wrażenie, że używanie gen_server było zalecanym sposobem działania podczas budowania komponentów aplikacji OTP. Dlaczego mochiweb może używać aplikacji OTP i zachowań nadzorcy, ale unika serwera gen_?

Odpowiedz

4

Istnieje serwer_generalny o nazwie mochiweb_socket_server. Wygenerowane moduły są tylko "modułami oddzwaniania" dla serwera gen_ do wywołania podczas odbierania przychodzącego żądania.

10

Używasz OTP/gen_servers dla procesów, które są objęte strategią restartu - to jest ich ponowne uruchomienie jest pod kontrolą.

Tak nie jest w przypadku procesów reprezentujących połączenia z przeglądarkami internetowymi. Jeśli ten proces zginie, serwer nie będzie mógł go ponownie uruchomić - dlatego uruchomienie go w OTP jest bezcelowe.

Mochiweb (i Yaws) używają gen_servers do powiązania z portem nasłuchującym, a następnie odradzają nienadzorowany proces obsługi nowego połączenia.

+3

Aplikacja stdlib jest aplikacją OTP. Po uruchomieniu nie ma żadnych działających części. Jest to prosta aplikacja biblioteki, tam dla modułów, które ładuje, więc inne aplikacje OTP mogą na nim polegać, aby uzyskać wszystkie swoje moduły. Nadal istnieją powody, by używać OTP, gdy tylko wprowadzamy moduły. – Christian

+0

Twoje prawo, byłem nieco kiepski w moim języku ... Powinieneś spakować cały swój kod w normalny sposób za pomocą OTP używając katalogów i innych rzeczy - ale czasami właściwym rozwiązaniem jest tylko odradzanie czegoś zamiast korzystania z serwera gen_server na początek. –

Powiązane problemy