从外部闭包停止执行函数?

时间:2015-06-06 00:37:45

标签: javascript node.js

我想运行一些预定的工作。这些工作可能需要很长时间,我想给他们一个超时。当一个函数已经运行60秒时,立即停止该函数的执行以及该函数的所有调用。

x <- matrix(0, nrow=80000, ncol=80000)
dim(x)
# [1] 80000 80000
x[1,1]
# Error: long vectors not supported yet: subset.c:733

这可能吗?

2 个答案:

答案 0 :(得分:1)

因为node.js本身是单线程的,所以x()之外的其他代码都不会运行,直到x()返回。因此,您无法在概念上执行您尝试使用同步运行的单个函数执行的操作。

有些库可以添加某种可以使用的线程(有特殊限制)。您可以查看此帖子,了解有关其中一些选项的更多详细信息:How to create threads in nodejs

如果您向我们展示了代码在x()内所做的事情,那么我们可以为您提供有关如何重新构建代码以实现目标的一些想法。如果它具有异步操作(或者可以转换为使用异步操作),那么x()将返回并且其他代码可以运行,而node.js正在等待那些异步操作来执行它们的操作并且您可以向那些异步操作发出信号他们应该停止做他们的事情的行动。但是,大部分时间都必须等待异步操作才能使该方案有效。

如果你可以将x()代码移动到一个单独的进程,那么你可以启动一个子进程,给它运行x()代码然后杀死整个节点子进程,如果它没有'在一定时间内完成。这显然是处理此函数调用的一种重量级方法,但它确实可以让您在需要时终止整个环境。如果从安全或隐私的角度来看,它还提供了进程隔离。

答案 1 :(得分:0)

如果你正在使用Node.js,你可以考虑使用 child_process 来进行异步函数调用,如果它在一段时间内没有完成,你可以稍后将其删除。

但是这种方法需要你将function x分离到另一个JS文件,比如 modulex.js ,它实现了:

function x(){
    // do whatever
}
x();

然后,在您的 main.js (或您提供的任何名称)中,您希望以异步方式开始在 modulex.js 中运行function x稍后将其删除,您可以通过 child_process 调用它,这是Node.js的内置功能之一:

var spawn = require('child_process').spawn;
var x = spawn('node modulex.js'); // give any particular arguments if required

x.stdout.on('data', function (data) {
    // event handler when function x finishes!

    // data = any output printed by modulex.js
});

x.stderr.on('data', function (data) {
    // event handler when function x fails!

    // data = any error printed by modulex.js
});

// Or kill the `x` after a timeout with this:
function timeout(){
    x.kill();
}

这种方法需要您稍微重新设计节点应用程序的体系结构。但这将更有效地应对单线程JavaScript。

我建议您在开始之前在 node.js 上阅读 child_process 的官方文档:https://nodejs.org/api/child_process.html