2013-12-08 14 views
5

mentre gioca con i flussi di nodo ho notato che praticamente ogni esercitazione insegna qualcosa di simile:Node.js stream API perdite

// Get Google's home page. 
require('http').get("http://www.google.com/", function(response) { 
    // The callback provides the response readable stream. 
    // Then, we open our output text stream. 
    var outStream = require('fs').createWriteStream("out.txt"); 

    // Pipe the input to the output, which writes the file. 
    response.pipe(outStream); 
}); 

Ma questo è un codice del pezzo abbastanza pericoloso, a mio parere. Cosa succede se il flusso di file genera un'eccezione fino a un certo punto? Penso che il flusso di file possa perdere memoria perché, secondo i documenti, il flusso di file non è ovviamente vicino.

Mi dovrei importare? Nella mia opzione node.js i flussi dovrebbero gestire le situazioni ...

risposta

2

Non riconoscere alcun errore nella VM del nodo, se c'è un'eccezione che interrompe l'operazione dopo che il flusso è stato aperto, mi aspetto che alla fine durante la garbage collection il VM rileva che nulla si riferisce al flusso e lo raccoglie, eliminando quindi le risorse ad esso associate.

Quindi non lo chiamerei "perdita".

Ci possono ancora essere problemi associati a non gestione di eccezioni o non chiusura di flussi. Ad esempio, su sistemi di tipo Unix quando viene creato un flusso che corrisponde a un file su disco, viene utilizzato un descrittore di file. C'è un limite al numero di descrittori di file che possono essere aperti contemporaneamente da un processo. Di conseguenza, se un processo che non chiude esplicitamente i suoi stream riesce a lasciare così tanti di questi non chiusi che colpisce il limite del descrittore di file prima della successiva garbage collection, si bloccherà.

+0

Questo è fondamentalmente quello che pensavo. Pertanto, uno stream di origine collegato a uno stream di destinazione non viene chiuso se lo stream di destinazione non riesce (eccezionalmente). – Kr0e

+0

Non si chiude non appena si verifica l'eccezione, ma la garbage collection dovrebbe raggiungerla e chiuderla. – Louis

4

Per evitare la perdita di descrittore di file, è inoltre necessario:

var outStream = require('fs').createWriteStream("out.txt"); 

// Add this to ensure that the out.txt's file descriptor is closed in case of error. 
response.on('error', function(err) { 
    outStream.end(); 
}); 

// Pipe the input to the output, which writes the file. 
response.pipe(outStream); 

Un altro metodo non documentato è outStream.destroy(), che chiude il descrittore pure, ma sembra che outStream.end() è preferito.