7

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

所以这里的解决方案是确保你自己的 EventEmitters 都不让进程保持活动状态,然后等待它退出。

于 2013-05-16T13:23:11.807 回答