2010-09-24 13 views
6

Recientemente me encontré con esta bonita biblioteca JS llamada nodeJS que actúa como un servidor JS.no bloqueante (E/S impulsada por eventos) vs. E/S de bloqueo

La característica principal del lenguaje es Evented I/O, lo que le da a la capacidad inherente de I/O de ser completamente no-bloqueante usando callbacks !!!

Mi pregunta es, si este tipo de mecanismo de E/S completamente no bloqueante existía en el pasado (la E/S de evento dado dado ha existido durante mucho tiempo), ¿por qué no son más populares en alto nivel? idiomas como C# y Java (aunque Java tiene implementación de NIO que admite E/S sin bloqueo)?

Actualmente, una operación simple de lectura/escritura de archivos resulta en un bloqueo de E/S completo, que no es el caso con E/S impulsada por eventos.

Me gustaría obtener una mejor comprensión de las E/S controladas por eventos y de cómo es diferente de lo que tenemos en Java.

+4

Tengo curiosidad por qué piensas que Java/C# no tiene async IO? –

+0

¿Quiere decir usar el paquete Java NIO? Nunca lo he usado, pero sé que es muy capaz. Cambiaré la pregunta para abordar este problema. –

Respuesta

5

Java: http://en.wikipedia.org/wiki/New_I/O

Una instalación de multiplexado, sin bloqueo de E/S para la escritura de servidores escalables

.NET: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

public IAsyncResult BeginReceive(
    byte[] buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    AsyncCallback callback, 
    Object state 
) 
+0

Kirk excelente !!. Pero puede explicar más sobre Nueva E/S. ¿Es un evento impulsado ?? Estoy tratando de compararlo con nodeJS. La razón por la cual nodeJS es tan popular se debe a su E/S impulsada por eventos. –

+0

No estoy seguro de si se trata de un "evento" en el sentido que usted quiere decir, pero este es un excelente tutorial: http://rox-xmlrpc.sourceforge.net/niotut/ –

+3

@A_Var: un motor basado en eventos es en realidad solo una abstracción de máquinas de estado. En los lenguajes en los que no existe un motor incorporado basado en eventos, la mayoría de los desarrolladores simplemente escriben su propia máquina de estados usando un ciclo while e instrucciones de conmutación (o una tabla de despacho). A veces, los desarrolladores pueden molestarse lo suficiente como para generalizar la implementación de su máquina de estado para crear una API, lo que da como resultado una biblioteca impulsada por eventos para el lenguaje. Un ejemplo de esto es el framework Twisted de Python. – slebetman

-4

Java tiene un mal soporte incluso para archivos básicos de E/S. Estos idiomas se crean para la creación rápida de aplicaciones GUI portátiles, y no para operaciones de E/S de bajo nivel optimizadas y dependientes del sistema operativo.

+0

No puedo decir si esta respuesta fue una broma. –

+0

Esto no se compara con E/S con evented y critica Java I/O. Sí Java E/S no bloqueante a través de multi-threading (no E/S pura sin bloqueo) es diferente de E/S impulsada por evento (que es E/S pura sin bloqueo) pero cada uno tiene sus propios pros y contras. Por favor apoye su declaración con ejemplos. –

1

lo que tengo entendido, hay una percepción generalizada de que el multihilo es más fácil que el manejo de eventos, ya que en programación multiproceso cada subproceso tiene un flujo de ejecución secuencial simple, mientras que controlado por eventos consiste en muchos pequeños fragmentos de código.

Por supuesto, esto es mejor indicar en otro lugar, ver por ejemplo Q.2 de state-threads FAQ.

3

Tcl ha tenido eventos de E/S desde la década de 1990 (si no me equivoco). Ciertamente, antes de 2000 porque fue cuando tclhttpd venció a Apache en las pruebas de referencia en algún momento en 2000 que la gente realmente comenzó a prestar atención a las E/S sin bloqueo. Cuando la gente lo vio, comenzaron a reescribir los servidores web. Uno de los primeros resultados fue Lighttpd: uno de los primeros servidores web no bloqueados escritos en C. En ese momento, el uso de E/S controladas por eventos en tcl a través del comando fileevent ya se consideraba una práctica estándar en el mundo tcl.

AOLserver tenía (y todavía tiene) un núcleo tcl y aloja uno de los sitios más activos en la web (al menos en los primeros días): http://www.aol.com/. Aunque el servidor en sí está escrito en C, utiliza la API C de tcl para implementar el manejo de eventos y E/S. El motivo por el que AOLserver utilizó el subsistema de E/S de tcl es porque usa tcl como lenguaje de scripting y los desarrolladores pensaron que, como alguien más lo había escrito, entonces bien podría usarlo.

Creo que AOLserver se lanzó por primera vez en 1995. Eso debería confirmar que la E/S controlada por eventos ya estaba disponible en tcl a mediados de la década de 1990.

Tcl es uno de los primeros, sino el primer lenguaje en tener un motor de eventos creado. El subsistema de eventos se implementó originalmente para la biblioteca Tk y más tarde se fusionó en tcl.

Cuestiones relacionadas