2010-07-14 12 views
10

Me preguntaba si OCaml funcionará bien en términos de rendimiento y facilidad de implementación al tratar con las interacciones típicas cliente/servidor a través de TCP en un entorno multiproceso ... Me refiero a algo realmente típico como tener un hilo por cliente que recibe datos, cambios operados en los estados del juego y enviarlos de vuelta a los clientes.¿Es OCaml adecuado para escribir servidores de redes?

Esto porque necesito escribir un servidor para un juego y siempre hice estas cosas en C, pero desde ahora sé que OCaml tenía curiosidad por saber si estaría bien o me voy a encontrar a mí mismo tratando de resolver una problema típico en un idioma que no encaja bien que ..

Gracias de antemano

Respuesta

10

Rendimiento: probablemente no. Los subprocesos de OCaml no proporcionan ejecución paralela, solo son una forma de estructurar su programa. El tiempo de ejecución de OCaml en sí no es seguro para subprocesos, por lo que el único código que podría ejecutarse en paralelo de un único subproceso OCaml sería un código C interconectado (sin devoluciones de llamada a OCaml!).

En cuanto a la implementación, hay un mutex en el tiempo de ejecución, que se libera cuando se llama a las primitivas C de bloqueo, y también se puede liberar cuando se llaman funciones C que hacen un trabajo importante.

Facilidad de implementación: no cambiaría el mundo. Tendría la comodidad de OCaml y una biblioteca parecida a una subventana en el lateral. Si está buscando cosas nuevas que descubrir mientras aprovecha lo que ha aprendido de OCaml, le recomiendo Jocaml. Se sincroniza y se sincroniza con OCaml, pero hubo una (re) reimplementación recientemente, e incluso cuando está un poco fuera de sincronización, es muy divertido y ofrece una perspectiva completamente nueva de los programas simultáneos.

Jocaml se implementa en la parte superior de OCaml. Como el tiempo de ejecución no es concurrente y todo, estoy casi seguro de que usa procesos separados y transmisión de mensajes. Pero para la aplicación que mencionaste debería poder hacerlo bien.

+3

JoCaml proporciona un modelo de simultaneidad (muy bueno) basado en el envío de mensajes al programador. Su programa básico de JoCaml se ejecuta en un solo tiempo de ejecución Caml; bajo el capó, los mensajes se envían entre hilos de ese tiempo de ejecución. JoCaml también proporciona funciones para la programación distribuida: los mensajes se pueden enviar de forma transparente entre los tiempos de ejecución que ni siquiera necesitan ejecutarse en la misma máquina. Si usa esto, no hay un aprovechamiento especial del caso especial en el que los tiempos de ejecución se estén ejecutando en la misma máquina. – Gilles

2

OCaml funcionará muy bien para aplicaciones de red, siempre que pueda vivir con un número relativamente pequeño de hilos activos al mismo tiempo — decir no más de 100. Podría considerar MLdonkey como ejemplo, aunque en el espacio del cliente, no en el espacio del servidor.

8

OCaml es muy adecuado para escribir servidores de red, aunque, como observa Pascal, existen limitaciones para enhebrar.

Afortunadamente, sin embargo, el enhebrado no es la única forma de organizar dicho programa. La biblioteca Lwt (para Light Weight Threads) proporciona una abstracción de E/S asíncronas que es bastante fácil de usar (particularmente cuando se combina con un poco de soporte de sintaxis). En realidad, todo se ejecuta en un hilo, pero todo está impulsado por un bucle de E/S asincrónico (creado en la llamada Unix select), y el estilo de programación le permite escribir código que se parece al código directo (evitando la sobrecarga de código normal). E/S asíncrona en muchos otros lenguajes). Por ejemplo:

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

Tanto la lectura y la escritura suceda de nuevo en el bucle de eventos principal, pero evitar la normal "leer, llamar a esta función cuando haya terminado" sobrecarga manual.

0

Haskell sería una mejor opción si quiere usar muchos hilos preventivos. GHC puede admitir un gran número de subprocesos y se ejecutan en paralelo en sistemas multinúcleo. OCaml prefiere el multihilo cooperativo y múltiples procesos.

+0

Esto es simplemente opinión. Ocisgen existe junto con cohttp. –

+0

@ Edgar ver editar – Demi

Cuestiones relacionadas