NodeJs:如果函数调用时间过长,请取消

m1m5dgzv  于 2023-04-29  发布在  Node.js
关注(0)|答案(3)|浏览(150)

在我的Node.js应用程序中,我需要某种机制来停止函数调用,如果调用时间过长。

function testIt() { ... }

runFunctionOnlyFor(1000, testIt, function (err) {
    if (err) console.log('function call timed out');
    else console.log('function call completed successfully');
});

现在,当然runFuncOnlyFor的实现是未知的(对我来说)。有什么建议如何实施?

4uqofj5v

4uqofj5v1#

我看到了一些问题。
1)通常不应该在Node中编写阻塞代码。JS,即使它是“只有”1秒。如果这是一个具有许多客户端的Web服务,则阻塞一秒钟可能会对性能产生破坏性影响。
2)从Node开始。JS实际上是单线程的,我真的没有看到任何简单的方法来在一定时间后取消执行,除非计时是由testit本身完成的,因为你需要一个单独的线程来运行中止第一个线程中运行的函数的函数。
一种更好的方法可能是使testit函数异步化,并将其分解为几个步骤,并通过中间上下文切换,并定期检查runFunctionOnlyFor在所需持续时间的计时器到期时可以设置的标志或类似物。
另一种方法是使用child process,如果这适合您的目的。

oipij1gg

oipij1gg2#

你可以通过创建一个代理函数来实现:
1-将旧函数存储在变量中
2-创建一个新函数,用参数中的值设置超时,并在超时后抛出错误。
示例:

async function testFunc (callback) {
  const res = await doSomeLogic();
  callback(null, res);
}

const oldTestFunc = testFunc;
async function proxiedTestFunc (timeout, callback) {
  const timeoutId = settimeout(() => {
    return callback("TIMEOUT", null);
  }, timeout);
  const res = await oldtestFunc();
  clearTimeout(timeoutId);
  callback(null, res);
}
sxpgvts3

sxpgvts33#

你可以用承诺做到。种族
在promise中添加你的长执行函数,并让它为p1;
创建一个promise,在你想要的最大持续时间上超时;
例如,该承诺将在500个米尔斯之后返回

const p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

使用Promise。收集第一完成承诺的竞赛

const response = await Promise.race([p1 , p2]);

如果承诺P1花费超过500个米尔斯来完成,则结果将来自承诺P2,并且P1将被立即取消。

相关问题