停止从外部闭包执行函数

Stop function execution from outer closure?

本文关键字:执行 函数 闭包 从外部      更新时间:2023-09-26

我想运行一些预定的作业。这些工作可能会占用很长时间,我想给他们一个暂停。如果一个函数已经运行了60秒,那么立即停止该函数的执行和对该函数的所有调用。

var x = function (){
    /* doing something for eventually a looong time */
}
x.kill()

这可能吗?

因为node.js本身是单线程的,所以在x()返回之前,x()之外的代码不会运行。所以,从概念上讲,你不能用一个同步运行的函数来做你想做的事情。

有一些库添加了一些你可以使用的线程(有特殊的限制)。你可以在这篇文章中了解更多关于这些选项的细节:如何在nodejs中创建线程

如果您向我们展示x()内部的代码,那么我们可以为您提供一些关于如何重组该代码以实现您的目标的想法。如果它有异步操作(或者可以转换为使用异步操作),那么x()将返回和其他代码可以运行,而node.js正在等待那些异步操作做他们的事情,你可以向那些异步操作发出信号,他们应该停止做他们的事情。但是,为了使该方案工作,大多数时间必须等待异步操作。

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

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

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

function x(){
    // do whatever
}
x();
而在你的main.js(或任何你给它的名字),你想开始运行function xmodulex.js异步并杀死它,你通过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