我有一个运行在Ubuntu
app.get/post calls
并与mongoDB
.对话
现在我需要定期运行独立的javascript,它将与相同的mongoDB对话。
因此,在app.js
中,我计划这样做:
app.get()
app.post()
...
app.listen(3443);
setInterval(function () {
runStandAloneScript();
}, 86400);
function runStandAloneScript() {
// makes http calls to local server and mongodb locally
}
我的问题是,这会以任何方式阻止/干扰app.get/post
调用吗?
发布于 2018-05-29 09:16:29
如果runStandAloneScript
是同步的,它将阻塞您的服务器,并且只要方法运行,它就会阻塞它。
setInterval(function () {
runStandAloneScript();
}, 86400);
function runStandAloneScript() {
sleepSync(5); // 5 seconds sleep, blocking
}
前面的脚本将阻塞服务器5秒,每隔86400秒,阻止任何请求被处理。
如果您在runStandAloneScript
中执行一些非阻塞I/O,您的服务器将正常工作。
function runStandAloneScript() {
return fs.readFile('./tmp/some-file.txt');
}
默认情况下,文件系统操作、数据库调用和http请求在Node.js中始终是异步的,因此,除非您正在运行一些繁重的计算或使用这些方法的同步版本(如fs.readFileSync
),否则您的服务器不会被阻塞。
发布于 2018-05-29 14:09:13
它不会被阻塞,除非你在setInterval中的函数是同步的。
基本上,在您的代码中,每86400毫秒调用一次runStandAloneScript()。一旦计时器过期,它将执行runStandAloneScript(),然后再次保持计时器,此过程继续。
话虽如此,如果runStandAloneScript()是同步的,那么它将阻塞服务器。因此,请使用异步函数,以便您的服务器适当地处理请求,或者根据场景使用子进程机制。
https://stackoverflow.com/questions/50575050
复制相似问题