如何确定在事件循环中是否还有事件已注册(奖金:多少)

Joa*_*urz 7 event-loop node.js

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

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

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

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

我发现了另一个问题,但它只讨论了如何监视事件循环以确定节点的性能是否仍然正常.但是我对性能不感兴趣(我不在乎执行代码是否阻塞了10s或者每2分钟只执行1ms)并且我不想使用外部工具但是要了解状态内部节点本身的事件循环.那可能吗?

Joa*_*urz 1

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

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

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

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

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

因此,这里的解决方案是确保您自己的 EventEmitters 都没有使进程保持活动状态,然后等待它退出。