如何找出事件循环中是否还有事件注册(奖金:多less)

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

在我目前的方法中,当接收到testing代码时,我开始一个新的subprocess并将代码交给它。 subprocess使代码使用Contextify创build一个沙箱,并使用这个沙箱执行代码。

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

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

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

我用某种方式解决了我的问题,虽然我没有find问题的一般答案。

这里的想法是,如果进程已经执行了所有的代码,并且没有EventEmitter被注册,进程将自行退出。 这基本上是我想要的,因为我想在进程“完成”时得到通知,现在我只能听到child_process的“退出”事件。

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

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

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

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