node.js - 如何找出事件循环中是否还有注册的事件(奖金: how many)

标签 node.js event-loop

我正在尝试编写一个 Node.js 程序来执行和监控 javascript 程序。我正在寻找一种方法来查明受监视的程序是否仍在“运行”,即做任何有用的事情。

在我目前的方法中,当收到要测试的代码时,我会启动一个新的子进程并将代码交给它。子进程检测代码使用 Contextify 创建沙箱并使用此沙箱执行代码。

sandbox.run(code) 调用返回后,我知道代码的阻塞部分已完成并且可以在 UI 中显示。但是,我现在不知道代码是否使用 setTimeouts 注册了任何计时器,或者是否创建了任何其他会导致部分代码稍后退出的事件源。所以我不知道它是否真的“完成”了。

Node.js 有没有办法检查事件循环中是否还有事件要处理(或者更好的是,还剩下多少)?

我找到了 this other question ,但它只谈到如何监控事件循环以找出 Node 的性能是否仍然良好。但我对性能不感兴趣(我不在乎执行代码是阻塞 10 秒还是每 2 分钟只做 1 毫秒)并且我不想使用外部工具但了解状态来自 Node 本身内部的事件循环。这可能吗?

最佳答案

虽然我没有找到问题的一般答案,但我以某种方式解决了我的问题。

这里的想法是,如果进程已经执行了它启动时使用的所有代码并且没有EventEmitters,那么进程将自行退出。已注册。这基本上就是我想要的,因为我想在进程“完成”时收到通知,现在我可以只听 child_process 的“退出”事件。

但是我执行代码的进程并没有自行退出。这有两个原因:

  1. 我使用计时器定期将收集到的有关执行的数据发送到父进程。如果注册了这样的计时器,则该过程将不会退出。你可以 unref计时器,但我担心这会导致数据丢失,因为进程可能会在发送最后一位数据之前退出(因为它不会等待计时器执行)。因此,我将代码更改为仅在有数据要发送时安排一个计时器,而不是定期检查要发送的数据。
  2. 我用了fork创建子进程。这也在父进程和子进程之间创建了一个通信 channel ,因为我需要将要执行的代码发送到 child_process,所以我使用 process.on("message", callback) 为从父进程收到的消息注册了子进程。但是,现在我们注册了另一个 EventEmitter,它可以防止进程退出。幸运的是,我意识到我只需要来自父进程的一条消息,不需要其他消息,因此我可以在收到该消息后删除事件发射器。所以我没有使用 process.on() process.once()它将只执行一次回调并在之后自动删除事件发射器。正是我想要的。或者你可以使用 process.removeListener() .

现在我只是等待 child_process 退出,因此知道一切都已完成,可以通知客户端。

因此,这里的解决方案是确保您自己的 EventEmitter 都不会使进程保持事件状态,然后等待它退出。

关于node.js - 如何找出事件循环中是否还有注册的事件(奖金: how many),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16446395/

相关文章:

node.js - 禁止在 PM2 中重启

node.js - Gitlab 测试覆盖率可视化不起作用

node.js - node js - 在回调执行期间传入事件会发生什么

javascript - 为什么在几乎没有阻塞操作的情况下,事件循环从 JavaScript 开始就存在

php - RatchetPHP 无法向循环中的所有客户端发送消息

javascript - 了解执行模型和事件循环

javascript - 使用额外字段引用 Mongoose 中的另一个模式

javascript - 如何将数据从 ejs(日期选择器)传递到 js(查询数据库),然后将结果显示回 ejs(在标签中)?

node.js - 无法将Nightmarejs应用程序部署到Heroku