Joa*_*urz 7 event-loop node.js
我正在尝试编写一个Node.js程序来执行和监控javascript程序.我正在寻找一种方法来确定受监控的程序是否仍在"运行",即做任何有用的事情.
在我目前的方法中,当接收要测试的代码时,我启动一个新的子进程并将代码交给它.子进程检测代码使用Contextify创建Sandbox 并使用此沙箱执行代码.
在sandbox.run(code)调用返回后,我知道代码的阻塞部分已完成,并且可以在UI中显示.但是,我现在不知道代码是否使用setTimeouts注册了任何计时器,或者创建了任何其他事件源,这些事件源会导致部分代码稍后退出.所以我不知道它是否真的"完蛋"了.
在Node.js中是否有办法检查事件循环上是否还有事件需要处理(或者甚至更好,剩下多少)?
我发现了另一个问题,但它只讨论了如何监视事件循环以确定节点的性能是否仍然正常.但是我对性能不感兴趣(我不在乎执行代码是否阻塞了10s或者每2分钟只执行1ms)并且我不想使用外部工具但是要了解状态内部节点本身的事件循环.那可能吗?
我以某种方式解决了我的问题,尽管我没有找到问题的一般答案。
这里的想法是,如果进程已执行了启动时的所有代码并且不再注册任何EventEmitters ,则进程将自行退出。这基本上就是我想要的,因为我想在进程“完成”时收到通知,现在我可以只监听 child_process 的“退出”事件。
但是我执行代码的进程并没有自行退出。这有两个原因:
process.on("message", callback)。然而,现在我们注册了另一个 EventEmitter,它可以防止进程退出。幸运的是,我意识到我只需要来自父进程的一条消息,不需要更多消息,因此我可以在收到该消息后删除事件发射器。因此,process.on()我使用的process.once()不是仅执行一次回调,然后自动删除事件发射器。正是我想要的。或者你可以使用process.removeListener().现在我只是等待 child_process 退出,从而知道一切都已完成并可以通知客户端。
因此,这里的解决方案是确保您自己的 EventEmitters 都没有使进程保持活动状态,然后等待它退出。