2010-07-14 4 views
10

Mi chiedevo se OCaml funzionasse bene in termini di prestazioni e facilità di implementazione mentre si gestiscono le tipiche interazioni client/server su TCP in un ambiente multi-thread. Voglio dire qualcosa di veramente tipico come avere un thread per client che riceve dati, ha operato modifiche agli stati di gioco e li ha inviati ai clienti.OCaml è adatto per scrivere server di rete?

Questo perché ho bisogno di scrivere un server per un gioco e ho sempre fatto queste cose in C ma da ora so che OCaml ero curioso di sapere se sarebbe andato bene problema tipico in una lingua che non si adatta bene che ..

Grazie in anticipo

risposta

10

performance: probabilmente non. I thread di OCaml non forniscono l'esecuzione parallela, sono solo un modo per strutturare il tuo programma. Il runtime di OCaml non è thread-safe, quindi l'unico codice che potrebbe essere eseguito in parallelo a un singolo thread di OCaml sarà interfacciato con il codice C (senza callback a OCaml!).

Per quanto riguarda l'implementazione, esiste un mutex in fase di esecuzione, che viene rilasciato quando si richiama il blocco dei primitivi C, e potrebbe anche essere rilasciato quando si chiamano funzioni C che svolgono un lavoro significativo.

Facilità di implementazione: non cambierebbe il mondo. Avresti il ​​comfort di OCaml e una libreria simile al pthread sul lato. Se stai cercando cose nuove da scoprire sfruttando ciò che hai imparato su OCaml, ti consiglio di utilizzare Jocaml. Entra in sincronia e in sincronia con OCaml, ma c'è stata una (ri-implementazione) abbastanza recente, e anche quando è leggermente fuori sincrono, è molto divertente e una prospettiva completamente nuova dei programmi concorrenti.

Jocaml è implementato su OCaml. Ciò che con il tempo di esecuzione non è concorrente e tutto, sono quasi sicuro che utilizza processi separati e passaggi di messaggi. Ma per l'applicazione che hai menzionato dovrebbe essere in grado di fare bene.

+3

JoCaml fornisce un (molto bello) modello di concorrenza basato sul messaggio che passa al programmatore. Il tuo programma JoCaml di base viene eseguito in un singolo runtime Caml; sotto il cofano, i messaggi vengono inviati tra i thread di quel runtime. JoCaml offre anche servizi per la programmazione distribuita: i messaggi possono essere inviati in modo trasparente tra runtime che non hanno nemmeno bisogno di essere eseguiti sulla stessa macchina. Se si utilizza questo, non vi è alcuna leva speciale del caso speciale in cui i runtime vengono eseguiti sulla stessa macchina. – Gilles

2

OCaml funzionerà perfettamente per le applicazioni di rete, purché sia ​​possibile vivere con un numero relativamente piccolo di thread attivi contemporaneamente. — dire non più di 100. Si potrebbe considerare MLdonkey come un esempio, sebbene nello spazio client non nello spazio del server.

8

OCaml è molto adatto per la scrittura di server di rete, sebbene, come osserva Pascal, ci siano delle limitazioni sul threading.

Fortunatamente, tuttavia, il threading non è l'unico modo per organizzare tale programma. La libreria Lwt (per thread leggeri) fornisce un'astrazione di I/O asincrono che è abbastanza facile da usare (in particolare quando combinato con un po 'di supporto per la sintassi). Tutto in realtà viene eseguito in un thread, ma è tutto guidato da un loop I/O asincrono (basato sulla chiamata Unix select) e lo stile di programmazione consente di scrivere codice simile al codice diretto (evitando gran parte del normale sovraccarico del codice di esecuzione). I/O asincrono in molte altre lingue). Per esempio:

lwt my_message = read_message socket in 
let repsonse = compute_response my_message in 
send_response socket response 

Sia la lettura e la scrittura accada di nuovo nel ciclo di eventi principale, ma si evita il normale "leggere, chiamando questa funzione quando il gioco è fatto" in testa manuale.

0

Haskell sarebbe una scelta migliore se si desidera utilizzare molti thread preventivi. GHC può supportare un numero enorme di thread e funzionano in parallelo su sistemi multicore. OCaml preferisce il multithreading cooperativo e più processi.

+0

Questa è semplicemente un'opinione. Ocisgen esiste insieme a cohttp. –

+0

@Edgar vedi modifica – Demi