如何在不阻止进一步执行的情况下在nodejs中添加数百万个数字?
How to add millions of numbers in nodejs without blocking the further execution?
我正在尝试在节点 js 中实现一个问题的解决方案,即:
例如:
应该return
"The sum of numbers from 1 to 5 is: 15"
如果
答案应该是:
"The sum of numbers from 1 to 100 is: 4950"
参数可以很大:
例如:
URL: http://localhost/sum/100000000
(千万)
服务器在任何时候都不应只处理一个请求。
我在某处读到 setImmediate 可能有帮助。
1 + 2 + 3 + ... + n 的总和可以表示为 n(n + 1) / 2。有关详细信息,请参阅 this link。
一般当你想要非阻塞执行时,你可以使用child_process模块:
https://nodejs.org/api/child_process.html
一个例子看起来像这样:
//fork a new process
var cp = require('child_process');
var child = cp.fork('./intensiveTask.js',[],{});
//listen for messages from the child process
child.on('message', function(ret) {
console.log("child process has finished", ret.data);
//kill the child process
child.kill();
});
//send a message to the child process
child.send({msg: "Foo"});
这里是子进程的代码(intensiveTask.js)
process.on('message', function(data) {
//do the intensive work here
var output=data.msg + " Bar";
//send the output back to the parent
process.send({msg: output});
});
我分享了一个可以帮助某人的代码片段-
var sum = 0
function run(number, cb) {
sum += number;
if(number === 15000) {
return cb(sum);
}
++number;
setImmediate(run, number, cb);
}
run(1, (result) => {
if(result) {
console.log(result);
}
});
上面的代码片段只是将 15000 数字和 returns 结果相加作为响应。一切都由 setImmediate 方法管理。从这里阅读更多- https://nodejs.org/api/timers.html
我正在尝试在节点 js 中实现一个问题的解决方案,即:
例如:
应该return
"The sum of numbers from 1 to 5 is: 15"
如果
答案应该是:
"The sum of numbers from 1 to 100 is: 4950"
参数可以很大:
例如:
URL: http://localhost/sum/100000000 (千万)
服务器在任何时候都不应只处理一个请求。
我在某处读到 setImmediate 可能有帮助。
1 + 2 + 3 + ... + n 的总和可以表示为 n(n + 1) / 2。有关详细信息,请参阅 this link。
一般当你想要非阻塞执行时,你可以使用child_process模块: https://nodejs.org/api/child_process.html
一个例子看起来像这样:
//fork a new process
var cp = require('child_process');
var child = cp.fork('./intensiveTask.js',[],{});
//listen for messages from the child process
child.on('message', function(ret) {
console.log("child process has finished", ret.data);
//kill the child process
child.kill();
});
//send a message to the child process
child.send({msg: "Foo"});
这里是子进程的代码(intensiveTask.js)
process.on('message', function(data) {
//do the intensive work here
var output=data.msg + " Bar";
//send the output back to the parent
process.send({msg: output});
});
我分享了一个可以帮助某人的代码片段-
var sum = 0
function run(number, cb) {
sum += number;
if(number === 15000) {
return cb(sum);
}
++number;
setImmediate(run, number, cb);
}
run(1, (result) => {
if(result) {
console.log(result);
}
});
上面的代码片段只是将 15000 数字和 returns 结果相加作为响应。一切都由 setImmediate 方法管理。从这里阅读更多- https://nodejs.org/api/timers.html