即使事件循环被其他东西占用,是否可以在NodeJS中使用 setTimeout 来终止进程?
例如,假设我的代码如下所示
setTimeout(async () => {
// Some code I run to gracefully exit my process.
}, timeout);
while (true) {
let r = 1;
}
我的超时中的回调将永远不会被命中,因为while循环将占用事件循环。有什么方法可以说:“在 N 秒之后执行以下代码而不管其他所有内容?”
我正在编写selenium测试,但由于某种原因,每隔一段时间测试就会“卡住”并且永远不会终止。我基本上想在一段时间后总是超时我的测试,所以我们不会进入永远运行的测试位置。
谢谢!
答案 0 :(得分:4)
由于JavaScript是单线程的,因此您要做的是使用fork创建一个工作者,这将使其具有多线程的感觉。这实际上只给我们两个节点实例,每个节点都有自己的事件循环。这个fork会有你的无限循环,你可以用你的超时杀死它。
<强> main.js 强>
const cp = require('child_process')
const path = require('path')
// Create the child
const child = cp.fork(path.join(__dirname, './worker.js'), [])
// Kill after "x" milliseconds
setTimeout(() => {
process.exit()
}, 5000);
// Listen for messages from the child
child.on('message', data => console.log(data))
接下来,您将设置您的工作人员:
<强> worker.js 强>
let i = 0;
while (true) {
// Send the value of "i" to the parent
process.send(i++);
}
孩子可以使用process.send(data)
向父母传达有关自己的信息。
家长可以使用child.on('message', ...)
收听来自孩子的消息。
我们可以做的另一件事是,如果您需要主进程来执行更多操作,则可以杀死子进程而不是主进程。在这种情况下,您可以在child.kill()
内调用setTimeout
。
const cp = require('child_process')
const path = require('path')
// Create the child
let child = cp.fork(path.join(__dirname, './worker.js'), [])
// Kill after "x" milliseconds
setTimeout(() => {
child.kill()
}, 5000);
如果eventloop中没有其他事件,主进程将自动关闭,因此我们无需调用process.exit()
。