2012-04-07 11 views
8

Il documentation for write() dice:Node.js' e l'evento di scarico

restituisce false per indicare che il buffer del kernel è pieno, ei dati saranno inviati in futuro.

e la documentazione per l'evento drain dice:

Dopo un metodo write() restituito false, questo evento viene emesso per indicare che è sicuro di scrivere di nuovo.

Che cosa significa? Devo aspettare l'evento drain prima di poter scrivere di nuovo? Cosa è successo ai dati che ho provato a scrivere? È perduto? Cosa succede quando chiamo la scrittura senza attendere l'evento drain?

risposta

6

È possibile chiamare write() senza preoccuparsi del valore restituito in modo sicuro. Il nodo bufferizza tutte le chiamate di scrittura mentre il buffer del kernel è pieno e le spinge in ordine come ci si aspetterebbe. Si non necessario attendere l'evento 'drain' prima di scrivere nuovamente.

Facoltativamente, è possibile controllare il valore di ritorno di write() e quindi notificare la cosa che sta scrivendo al flusso che il buffer è pieno. Questo è esattamente ciò che Stream#pipe() does.

Così di solito, basta usare Stream#pipe() e tutte le chicche sono presi cura di per voi :)

+1

Che cosa succede se si chiama 'process.exit()', mentre il 'res.write' è ancora tamponata nella memoria utente (cioè non scaricato nel buffer del kernel)? La risposta si perde? – Emmett

+0

@Emmett yes, se si chiama 'process.exit()' mentre le chiamate di scrittura bufferizzate rimangono per essere scaricate, tali dati andranno persi. – TooTallNate

+1

Non è del tutto sicuro "chiamare' write() 'senza preoccuparsi del valore di ritorno". I [documenti attuali] (https://nodejs.org/dist/v8.4.0/docs/api/stream.html) dicono: _ "Durante il richiamo di' write() 'su un flusso che non sta svuotando è permesso, Node .js bufferizzerà tutti i blocchi scritti fino a quando non si verificherà l'utilizzo massimo della memoria, a quel punto si interromperà incondizionatamente.Ancora prima che si interrompa, l'uso elevato della memoria causerà scarso rendimento del garbage collector e alto RSS (che in genere non viene restituito al sistema, anche dopo che la memoria non è più necessaria). "_ Vedi anche: https://stackoverflow.com/q/37579605 – TachyonVortex