我有一台Express服务器,它提供一些计算作为Web服务。
计算时间范围从<1s到10s。
当有新请求进来时,有没有办法停止执行请求处理函数(这是其中一项计算)?
基本上,问题是:有没有办法在Javascript中停止执行函数? 如果没有,有没有办法可以终止处理Express请求的线程? 如果没有,你会建议什么?
答案 0 :(得分:0)
你做不到。 JavaScript,包括Node.js,本质上是单线程的。如果CPU绑定函数正在运行,则没有任何内容可以中断它。
运行这些计算的更好方法是分叉另一个进程来运行它们,然后可以停止它们。例如:
fibo.js
function fibo(n) { // intentionally naive cpu-bound computation
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
process.on('message', function(n) {
process.send(fibo(n));
});
server.js
var http = require('http'), cp = require('child_process');
var fibo;
http.createServer(function(req, res) {
if(fibo) {
fibo.kill();
fibo = null;
res.end('terminated');
} else {
fibo = cp.fork('./fibo.js');
fibo.on('message', function(n) {
res.end(n);
});
fibo.on('exit', function() {
res.end('terminated by other request');
});
fibo.send(50);
}
}).listen(8000);
这只是一个例子。请不要按原样使用。此服务器只能处理实际计算内容的一个并发请求,child_process.fork
不轻量级。