NodeJS处理变量和并发连接

时间:2018-12-11 18:51:32

标签: javascript node.js express

我正在设法将javascript和nodejs如何用于并发连接。

请考虑以下最小示例:

var app = express();
var i = 0;

app.get("/", function(req, res) {

    if (i < 10){
         doSomething();
         i++;
    }else{
         doDefault();
    }

    res.render("test");
}

如果您访问该页面10次,以下代码将执行doSomething(),但随后的请求将执行doDefault()。

doSomething()是否可以运行11次或更多次?因为对服务器的多个并发请求可以将i <10判断为true,但是请求同时执行i ++?

如果doSomething()在服务器上本地读取文件会发生什么,该请求将在javascript中同时发生(带有回调或Promise,因为这是节点的处理方式),并且仍然继续执行。这样做会安全吗?

if (i < 10){
    i++;
    doSomething();
}

我现在是否可以保证函数doSomething()可以准确运行10次,即使同时有数千个请求到达服务器?

1 个答案:

答案 0 :(得分:0)

这是异步性质的体现。即使您向NodeJS发出了并行请求,但是请求也一一到达服务器。在Javascript中,所有默认情况下都是同步的,这意味着下一个请求只能在第一个请求之后处理。因此,如果您的API包含需要5分钟的阻止代码,则即使同时到达,您的下一个请求也会在5分钟后执行。

在您的示例中,doSomething()可以是同步或异步的,它不会影响同步流,并且会i++接受下一个请求。

要进行模拟,您可以尝试使用for循环,并查看何时响应下一个API调用。

var app = express();
var i = 0;

app.get("/", function(req, res) {
  console.log('request received i = ', i);

  for(let j = 0; j<9999999999999; j++) {}

  i++;
  res.render("test");
}

如果您甚至想为i>10执行所有并行请求,只需在某些异步函数之后递增i

app.get("/", function(req, res) {
  console.log('request received i = ', i);

  if (i<10) {
    setTimeout(function(){
      i++;
    },5000);
  } else {
    doSomethingElse();
  }
  res.render("test");
}

在第一个请求的5秒内收到的任何请求数,将执行,因为i的值未递增,并且在异步工作5秒后将递增。这是异步和事件循环的逻辑。

请检查more over event loop