Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs一个请求阻止另一个请求_Javascript_Node.js - Fatal编程技术网

Javascript Nodejs一个请求阻止另一个请求

Javascript Nodejs一个请求阻止另一个请求,javascript,node.js,Javascript,Node.js,如果一个请求需要很长时间才能执行,则另一个选项卡将等待第一个请求完成。为什么?请给我解释一下。如何解决呢?这是我的代码: var http = require("http"); var url = require("url"); http.createServer(function(request, response) { if (url.parse(request.url).pathname == '/long') { function longlong()

如果一个请求需要很长时间才能执行,则另一个选项卡将等待第一个请求完成。为什么?请给我解释一下。如何解决呢?这是我的代码:

var http = require("http");
var url = require("url");

http.createServer(function(request, response) {

    if (url.parse(request.url).pathname == '/long')
    {
        function longlong()
        {
            var counter = 0;
            var startTime = new Date().getTime();
            while (new Date().getTime() < startTime + 10000)
            {
                counter++;
            }
            return counter;
        }

        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write(longlong() + '');
        response.end();
    }
    else
    {
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.write(0 + '');
      response.end();
    }

}).listen(8888);
var http=require(“http”);
var url=要求(“url”);
createServer(函数(请求、响应){
if(url.parse(request.url).pathname=='/long')
{
函数longlong()
{
var计数器=0;
var startTime=new Date().getTime();
while(新日期().getTime()因为NodeJS是单线程的(就像浏览器JavaScript一样)。它一次只能处理一个代码。我们得到了并发的错觉,因为NodeJS有非常奇特的代码块队列,这些代码块是以异步方式触发的。但是,一旦处理了块,就不能同时处理其他块

使用NodeJS时,您必须确保每个请求都结束(成功或失败),否则它可能会崩溃,超出任何帮助范围(整个服务器,而不仅仅是请求)

另外,使用
process.nextTick
代替传统的循环可能会帮助您的请求更快地工作(即更具可扩展性)。

良好阅读:

这篇文章的一个要点是:

…但是,除了您的代码之外,所有内容都并行运行

这意味着昂贵的I/O应该是异步的,但您的代码可能会阻塞。但是,我们担心在服务器上阻塞的I/O通常非常昂贵


有关更多详细信息,请参见另一个问题的示例:

我理解这一点,但如何防止阻止另一个(简单)请求?你能给我举个例子吗?你不能!它将始终阻止所有其他请求。你到底想要实现什么?您的请求处理程序没有多大意义。它只是一个示例。在现实世界中,它从几个异步DB请求中收集数据,并对其进行处理—重新分组、计算平均值、准备显示,需要约10秒,但另一个请求正在等待此请求。我试图理解如何使用它。这种CPU密集型任务不应该在NodeJS中完成。尝试为NodeJS编写一个C插件:或者查看
进程。nextTick
…但是,除了你的代码之外,所有东西都是并行运行的