2012-04-07 29 views
8

El documentation for write() dice:Node.js' y el evento de drenaje

devuelve false para indicar que el búfer del núcleo está lleno, y los datos serán enviados en el futuro.

y la documentación para el evento drain dice:

Después de un método de escritura() devuelve false, este evento se emite para indicar que es seguro volver a escribir.

¿Qué significa eso? ¿Debo esperar al evento drain antes de poder volver a escribir? ¿Qué pasó con los datos que traté de escribir? ¿Eso está perdido? ¿Qué sucede cuando llamo a escribir sin esperar el evento drain?

Respuesta

6

Puede llamar al write() sin preocuparse por el valor de retorno de forma segura. El nodo almacenará en búfer todas las llamadas de escritura mientras el kernel está lleno, y las empujará en orden como era de esperar. Usted no necesita esperar al evento 'drain' antes de volver a escribir.

Opcionalmente, puede verificar el valor de retorno de write() y luego notificar a la cosa que está escribiendo en el flujo que el búfer está lleno. Esto es exactamente lo que Stream#pipe() does.

Así que por lo general, sólo tiene que utilizar Stream#pipe() y todos los objetos valiosos se toman el cuidado de usted :)

+1

¿Qué pasa si se llama 'process.exit()' 'mientras que el res.write' todavía se almacena temporalmente en la memoria de usuario (es decir, no se vació al buffer del kernel)? ¿La respuesta se pierde? – Emmett

+0

@Emmett sí, si llama a 'process.exit()' mientras hay llamadas de escritura almacenadas que se van a enjuagar, entonces esos datos se perderán. – TooTallNate

+1

No es completamente seguro "llamar a' write() 'sin preocuparse por el valor de retorno". Los [documentos actuales] (https://nodejs.org/dist/v8.4.0/docs/api/stream.html) dicen: _ "Mientras está permitido llamar a' write() 'en una secuencia que no está drenando, Node .js almacenará en búfer todos los fragmentos escritos hasta que se produzca el máximo uso de memoria, en cuyo punto se cancelará incondicionalmente. Incluso antes de que se anule, el uso de memoria alta provocará un mal rendimiento del recolector de basura y un alto RSS (que normalmente no se devuelve al sistema, incluso después de que ya no se requiera memoria). "_ También vea: https://stackoverflow.com/q/37579605 – TachyonVortex

Cuestiones relacionadas