首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >setInterval会阻止/干扰node.js/express HTTP服务器吗?

setInterval会阻止/干扰node.js/express HTTP服务器吗?
EN

Stack Overflow用户
提问于 2018-05-29 09:13:34
回答 2查看 785关注 0票数 1

我有一个运行在Ubuntu

  • 上的快速http服务器,它执行一些app.get/post calls并与mongoDB.

对话

现在我需要定期运行独立的javascript,它将与相同的mongoDB对话。

因此,在app.js中,我计划这样做:

代码语言:javascript
复制
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调用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-29 09:16:29

如果runStandAloneScript是同步的,它将阻塞您的服务器,并且只要方法运行,它就会阻塞它。

代码语言:javascript
复制
setInterval(function () {
  runStandAloneScript();
}, 86400); 

function runStandAloneScript() {
   sleepSync(5); // 5 seconds sleep, blocking
}

前面的脚本将阻塞服务器5秒,每隔86400秒,阻止任何请求被处理。

如果您在runStandAloneScript中执行一些非阻塞I/O,您的服务器将正常工作。

代码语言:javascript
复制
function runStandAloneScript() {
   return fs.readFile('./tmp/some-file.txt');
}

默认情况下,文件系统操作、数据库调用和http请求在Node.js中始终是异步的,因此,除非您正在运行一些繁重的计算或使用这些方法的同步版本(如fs.readFileSync ),否则您的服务器不会被阻塞。

票数 1
EN

Stack Overflow用户

发布于 2018-05-29 14:09:13

它不会被阻塞,除非你在setInterval中的函数是同步的。

基本上,在您的代码中,每86400毫秒调用一次runStandAloneScript()。一旦计时器过期,它将执行runStandAloneScript(),然后再次保持计时器,此过程继续。

话虽如此,如果runStandAloneScript()是同步的,那么它将阻塞服务器。因此,请使用异步函数,以便您的服务器适当地处理请求,或者根据场景使用子进程机制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50575050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档