2011-05-07 12 views
7

Me gustaría agregar un tiempo de espera de una hora a este proceso para que no se quede para siempre en el caso de un interbloqueo de flujo. El único problema es si digo setTimeout, el proceso no tiene la oportunidad de terminar antes de lo previsto.Node.JS: setTimeout que no mantiene el proceso en ejecución

¿Hay alguna manera de establecer un tiempo de espera de salida forzada después de aproximadamente una hora, sin mantener el proceso en funcionamiento? ¿O estoy atrapado entre el uso de process.exit y sin este tiempo de espera?

Respuesta

12

No sé cuando unref se añadió al Nodo pero esto ahora es una posible solución. La reutilización de código de Matt:

var timeoutId = setTimeout(callback, 3600000); 
timeoutId.unref(); // Now, Node won't wait for this timeout to complete if it needs to exit earlier. 

El documento dice:

En el caso de setTimeout cuando unref se crea un temporizador separado que despertarè el bucle de eventos, la creación de muchos de estos pueden afectar negativamente evento efecto rendimiento del bucle: use con prudencia.

No te vayas loco por eso.

+1

Bien, no había oído hablar de esto. ['unref' fue agregado en el Nodo 0.9.1.] (https://github.com/joyent/node/releases/tag/v0.9.1) –

5

Si guarda el valor devuelto por setTimeout siempre se puede cancelar antes de que se dispara con clearTimeout, así:

var timeoutId = setTimeout(callback, 3600000); // 1 hour 

// later, before an hour has passed 
clearTimeout(timeoutId); 
+0

Esperaba algo que no requiera 'clearTimeout'. Voy a prescindir. –

1

Posible solución utilizando un new feature que was implemented como process.watchers(), pero yo no sé si se incluyó en una versión publicada todavía. El pull request aún está abierto a partir de esta publicación.

Pero en general, escribiría una función personalizada setTimeout que agregue todos los tiempos de espera a un contador, y justo antes de los tiempos de espera para la devolución de llamada, se eliminaría del contador.

A continuación, cree un intervalo continuo, y el intervalo se verificará y notará cuando todos los andadores solo son tiempos de espera establecidos por su función personalizada.

Cuando se da cuenta de esto, borraría (borraría todos sus tiempos de espera, causando una) salida.

Esto por supuesto no es grande, porque

  • El concepto no está probado. (No sé qué tipo de datos devolverá el process.watchers(), o si aún funciona)
  • El intervalo es un método de sondeo. (No es agradable si quieres retorno inmediato al mismo tiempo de uso tan bajo CPU)
Cuestiones relacionadas