事件循环为空或在超时后退出Node.js进程

我有一个Node应用程序做一些asynchronous的事情,我不能冒险的事情,许多模块之一做坏事,卡住,所以应用程序将永远不会退出。 (这只是在发送日志消息到服务时发生的。)

我不能直接使用process.exit ,因为无论有多less个asynchronous操作挂起,它都会终止。 尽pipe如此,我想尽快退出,所以这不会:

 function exit() { setTimeout(function() { process.exit(1); }, 10000); } 

因为这将等待10秒,即使一切正常,1秒后所有的asynchronous事件结束。

我正在考虑检查如果事件循环是空的,除了这个计时器,然后退出。 这可能是通过一些无证的stream程方法来完成的,但是我更喜欢避免这样的黑幕。 任何想法更好的方法来解决这个问题?

你可以设置你的计时器为任何你想要的超时时间为“卡住”的asynchronous操作。

然后.unref()这个定时器 。 这将使定时器本身保持node.js退出,所有asynchronous操作完成或定时器触发时,退出,以先到者为准。

 function exit() { var t = setTimeout(function() { process.exit(1); }, 10000); // allow process to exist naturally before the timer if it is ready to t.unref(); } 

有些东西告诉我,一个更可控和更健壮的解决scheme将是更强大地编码每个asynchronous事件。 可以像外部服务器的HTTP请求一样卡住的事物有自己的超时设置,所以如果你设置它们,那么它们将自己完成一种或另一种方式,而且不会冒你的外部计时器可能会在asynchronous操作完成时触发,甚至没有卡住,但速度很慢。