2014-10-03 11 views
25

dire che hoQuali sono le differenze tra evento leggibile e dati di process.stdin stream?

process.stdin.setEncoding('utf8'); 
var myString = ''; 

Quali sono le differenze tra

process.stdin.on('readable', function() { 
    myString += process.stdin.read(); 
}); 

e

process.stdin.on('data', function(chunk) { 
    myString += chunk; 
}); 

Mi danno la stessa myString se la stringa di input è lo stesso una volta stdin è la fine

Quali sono le migliori pratiche per ciascuna? Grazie

risposta

32

Sono due API diverse che consentono di accedere allo stesso flusso di blocchi di dati. L'API 'readable' è stata introdotta nel nodo 0.10.0 come parte di "Streams 2", quindi se la cerchi, dovrebbe essere d'aiuto. Il nocciolo della questione è che l'interfaccia 'readable' consente una gestione e buffering dei dati molto più semplice.

L'esempio 'data' chiama la tua funzione con un blocco e non hai altra scelta che gestirlo, altrimenti sarà perso per sempre. Nell'esempio 'readable', la funzione ti dice che i dati sono disponibili, ma puoi leggerli in qualsiasi momento. Ciò consente al sistema sottostante di sapere se i dati sono stati gestiti o meno, quindi è molto semplice supportare un concetto chiamato backpressure.

Ad esempio, in un flusso di rete, se un client invia dati tramite una connessione TCP a un server e il server è molto occupato, riceverà gli eventi readable, ma potrebbe scegliere di attendere i dati fino a quando non lo leggerà ha effettivamente le risorse per gestire i dati. Non leggendo i dati, il flusso lo bufferizzerà e man mano che quel buffer si avvicina a una dimensione massima, il flusso smetterà di leggere i pacchetti dal sistema operativo per evitare di occupare troppa RAM. Quindi il sistema operativo inizierà a rilasciare pacchetti e, poiché i pacchetti sono stati rilasciati, il client che sta inviando i dati ridurrà la velocità con cui invia i dati per cercare di ridurre la quantità di pacchetti.

Questo è tutto tecnicamente supportato con l'implementazione "V1" del flusso precedente, ma era molto più difficile da fare.

Quindi, in sostanza, se ci si aspetta un sacco di dati, l'utilizzo di 'leggibili' o la progettazione dei flussi da collegare è una buona idea, ma se si stanno solo leggendo bit di dati da un terminale, è probabile che si vedrà differenza zero.

Problemi correlati