【问题标题】:Exit Node.js process after event loop is empty OR after timeout事件循环为空或超时后退出 Node.js 进程
【发布时间】:2016-09-18 07:58:36
【问题描述】:

我有一个 Node 应用程序在做一些异步的事情,我不能冒险其中一个模块做了坏事并卡住了,所以应用程序永远不会退出。 (它只是在向服务发送日志消息时发生。)

我不能直接使用process.exit,因为无论有多少异步操作挂起,它都会终止。不过我还是想尽早退出,所以这样不行:

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

因为这将等待 10 秒,即使一切正常并且所有异步事件在 1 秒后完成。

我正在考虑检查事件循环是否为空,除了这个计时器,然后退出。这可以通过一些undocumented process methods 来完成,但我更喜欢避免这样的阴暗的东西。关于解决此问题的更好方法的任何想法?

【问题讨论】:

    标签: javascript node.js asynchronous timeout


    【解决方案1】:

    您可以将计时器设置为您希望超时持续时间为“卡住”异步操作的任何时间。

    然后.unref() the timer。这将阻止计时器本身阻止 node.js 退出,因此它将在所有异步操作完成或计时器触发时退出,以先到者为准。

    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();
    }
    

    有些事情告诉我,更可控和更健壮的解决方案是对每个单独的异步事件进行更健壮的编码。像外部服务器的 HTTP 请求这样可能会卡住的事情有它们自己的超时设置,因此如果您设置它们,那么它们将自行完成一种或另一种方式,并且您不会冒外部服务器的风险计时器可能会在异步操作完成之前触发,而它甚至没有被卡住,但速度很慢。

    【讨论】:

    • 关于健壮编码的好点,但是在这种情况下,问题是除非明确关闭它,否则 WebSocket 连接会无限期地保持打开状态,所以我不能抓住任何机会。
    • @ciscoheat - 如果这是您真正想要的,为什么不直接在 webSocket 连接上实现超时?
    • 它是私有的(在第 3 部分模块中),我无法访问它,也不想破解它。
    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多