2010-09-24 6 views
6

Recentemente mi sono imbattuto in questa libreria JS piuttosto carina chiamata nodoJS che si comporta come un JS lato server.non bloccante (I/O guidato dagli eventi) e I/O di blocco

La caratteristica principale del linguaggio è Evented I/O che offre la capacità intrinseca di I/O di essere completamente non bloccante utilizzando i callback !!!

La mia domanda è, se questo tipo di meccanismo I/O completamente non bloccante esisteva in passato (dato che l'I/O guidato da eventi è in circolazione da molto tempo), perché non sono più popolari in alto livello lingue come C# e Java (anche se Java ha un'implementazione NIO che supporta I/O non bloccanti)?

Attualmente, una semplice operazione di lettura/scrittura file risulta in un blocco I/O completo che non è il caso con I/O guidato da evento.

Mi piacerebbe avere una migliore comprensione dell'I/O basato su eventi e di come è diverso da ciò che abbiamo in Java.

+4

Sono curioso perché pensi che Java/C# non abbia IO asincrono? –

+0

Significa usare il pacchetto Java NIO ??. Non l'ho mai usato, ma so che è molto capace. Cambierò la domanda per risolvere questo problema. –

risposta

5

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

Un impianto di multiplex, non-blocking I/O per la scrittura di server scalabili

.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 eccellente !!. Ma puoi spiegare di più su New I/O. È guidato da eventi? Sto provando a confrontarlo con nodeJS. Il motivo per cui nodeJS è così popolare è dovuto all'I/O basato sugli eventi. –

+0

Non sono sicuro che sia "evento" guidato nel senso che intendi, ma questo è un eccellente tutorial: http://rox-xmlrpc.sourceforge.net/niotut/ –

+3

@A_Var: un motore basato sugli eventi è in realtà solo un'astrazione di macchine di stato. Nelle lingue in cui non esiste un motore integrato basato sugli eventi, la maggior parte degli sviluppatori scrive semplicemente la propria macchina di stato utilizzando un ciclo while e istruzioni switch (o una tabella di distribuzione). A volte gli sviluppatori possono essere infastiditi abbastanza da generalizzare la loro implementazione della macchina di stato per creare un'API che ne deriva e creare una libreria basata sugli eventi per la lingua. Un esempio di questo è il framework Twisted di Python. – slebetman

-4

Java ha un cattivo supporto anche per I/O di file di base. Questi linguaggi sono creati per la creazione rapida di applicazioni GUI portatili e non per operazioni di I/O di basso livello ottimizzate e dipendenti dal SO.

+0

Non posso dire, questa risposta è stata una barzelletta? –

+0

Questo non è paragonabile a I/O evento e critica I/O Java. Sì L'I/O non bloccante di Java tramite multi-threading (sebbene non sia un I/O non blocco puro) è diverso dall'I/O guidato dagli eventi (che è puro I/O non bloccante) ma ognuno ha i propri pro e contro. Si prega di sostenere la tua dichiarazione con esempi. –

1

A quanto mi risulta, non c'è una percezione diffusa di che il multithreading è più facile dell'evento, dal momento che in programmazione multithreading ogni thread ha un semplice flusso sequenziale di esecuzione, mentre event-driven consiste in molti piccoli frammenti di codice.

Naturalmente, questo è meglio indicato altrove, vedere ad esempio Q.2 di state-threads FAQ.

3

Tcl ha avuto l'I/O guidato dagli eventi degli anni '90 (se non mi sbaglio). Certamente prima del 2000 perché era quando tclhttpd batteva Apache in test di benchmark nel 2000, quando la gente iniziava a prestare attenzione all'I/O non bloccante. Quando la gente ha visto ciò, ha iniziato a riscrivere i server web. Uno dei primi risultati è stato Lighttpd: uno dei primi server Web non bloccanti scritti in C. A quell'epoca, l'utilizzo di I/O basato sugli eventi in tcl tramite il comando fileevent era già considerato una pratica standard nel mondo tcl.

AOLserver aveva (e ha ancora) un tcl core e ospita uno dei siti più attivi del Web (almeno nei primi giorni): http://www.aol.com/. Sebbene il server stesso sia scritto in C, utilizza l'API C di tcl per implementare la gestione degli eventi e I/O. Il motivo per cui AOLserver ha utilizzato il sottosistema I/O di tcl è perché utilizza tcl come linguaggio di scripting e gli sviluppatori hanno pensato che, poiché qualcuno lo ha scritto, potrebbe anche usarlo.

Credo che AOLserver sia stato rilasciato per la prima volta nel 1995. Ciò dovrebbe confermare che l'I/O basato sugli eventi era già disponibile a metà degli anni '90.

Tcl è uno dei primi, se non è il lingua prima di avere un motore basato su eventi costruito. Il sottosistema degli eventi è stato originariamente implementato per la libreria Tk e successivamente è stato fuso in tcl.