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

时间:2013-05-08 17:07:53

标签: node.js event-loop

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我在某种程度上解决了我的问题,虽然我没有找到问题的一般答案。

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

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

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

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