2009-08-31 10 views
12

Dopo aver letto il libro di Joe Armstrong e osservato gli screencast di Kevin Smith, ho creato una semplice applicazione OTP composta da un singolo gen_server e un singolo supervisore, raggruppati insieme come un'applicazione OTP.Quando utilizzare gen_server nelle applicazioni Erlang/OTP

Ora sto guardando mochiweb e ho creato un progetto di esempio [helloworld] utilizzando lo script new_mochiweb.erl. Navigando nel codice sorgente vedo che non è dissimile dalla mia app OTP di esempio [l'applicazione OTP è lì, il supervisore è lì] con una differenza chiave .. i file helloworld.erl e helloworld_web.erl generati non implementano il comportamento di gen_server, essi sono solo moduli standard di Erlang.

Ho avuto l'impressione che l'utilizzo di gen_server fosse il metodo consigliato per la creazione di componenti dell'applicazione OTP. Perché mochiweb potrebbe usare i comportamenti dell'applicazione OTP e del supervisore, ma evitare gen_server?

risposta

4

C'è un gen_server, chiamato mochiweb_socket_server. I moduli generati sono solo "moduli di richiamata" per il gen_server da chiamare quando si riceve una richiesta in arrivo.

10

Si utilizzano OTP/gen_server per i processi che sono sotto una strategia di riavvio - che è il riavvio di loro è nel controllo.

Questo non è il caso dei processi che rappresentano le connessioni ai browser web. Se quel processo muore, non è possibile per il server riavviarlo, quindi eseguirlo con OTP è inutile.

Mochiweb (e Yaws) utilizzano entrambi gen_server per collegarsi alla porta di ascolto e quindi generare un processo non supervisionato per gestire una nuova connessione.

+3

L'applicazione stdlib è un'applicazione OTP. Quando avviato, non ha parti in esecuzione. È una semplice applicazione di libreria, lì per i moduli che carica, quindi altre applicazioni OTP possono dipendere da esso per ottenere tutti i suoi moduli. Quindi ci sono ancora dei motivi per usare OTP quando si introducono solo moduli. – Christian

+0

Hai ragione, ero un po 'sdolcinato nel mio linguaggio ... Dovresti impacchettare tutto il tuo codice nel normale modo OTP usando le directory e roba - ma a volte la cosa giusta da fare è generare qualcosa invece di usare un gen_server per avviarlo. –