如何使节点同时工作?

时间:2014-02-20 13:14:31

标签: node.js concurrency

Node.js以并发而闻名,然而,我对如何使它同时工作感到困惑。我很快就逐一启动了Chrome的两个请求,我预计控制台中的输出应该是:

  
      
  1. “获得新请求”
  2.   
  3. 在我的第二次请求之后立即打印“获取新请求”
  4.   
  5. 几秒钟后,“结束新请求”
  6.   
  7. 几秒钟后,“结束新请求”
  8.   

但是,我看到的是:

  
      
  1. “获得新请求”
  2.   
  3. 几秒钟后,“结束新请求”
  4.   
  5. “获得新请求”
  6.   
  7. 几秒钟后,结束新请求
  8.   

这意味着第二个请求在第一个请求完成之前不会被处理。以下是我的示例代码,我错过了什么?

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

   function start(route) {
    http.createServer(function(request, response) {
      console.log('get a new request');

      // a time consuming loop           
      for (var i=0; i<10000000000; ++i) {
      }

      route(url.parse(request.url).pathname);
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.end();
      console.log('end the new request');
    }).listen(5858);
   }

   function saySomething(something)  {
     console.log(something);
   }

   exports.start = start;
   exports.saySomething = saySomething;

4 个答案:

答案 0 :(得分:3)

您无需做任何事情。

它基于非阻塞I / O.简而言之,有一个事件循环。运行一组同步代码,完成后,运行下一次迭代,选择要运行的下一组同步代码。无论何时运行异步操作(db fetch,setTimeout,读取文件等),都会运行事件循环的下一个滴答。这种方式永远不会有任何代码等待。

没有线程。在你的例子中,for循环是一个连续的代码块,所以js将运行整个for循环,然后才能处理另一个http请求。

尝试在for循环周围放置一个setTimeout,以便节点可以切换到下一个事件循环,并在您的情况下处理Web请求。

答案 1 :(得分:2)

节点无法处理这些:

for (var i=0; i<10000000000; ++i) {}

兼任。但它同时处理IO

答案 2 :(得分:1)

答案 3 :(得分:-1)

这是预期的行为,̶我们称这种̶̶b̶l̶o̶c̶k̶i̶n̶g̶,该溶液用于处理并发请求是使代码̶̶n̶o̶n̶-̶b̶l̶o̶c̶k̶i̶n̶g̶,一旦你打电话̶{{1 ̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶{̶r̶e̶s̶p̶o̶n̶s̶e̶.̶w̶r̶i̶t̶e̶H̶e̶a̶d̶ <。

编辑7/8/14: 不得不最近处理这个问题,发现你可以使用线程: https://www.npmjs.org/package/webworker-threads

Webworker-threads为Node.js中缺少的CPU绑定任务提供异步API:

̶r̶e̶s̶p̶o̶n̶s̶e̶.̶e̶n̶d̶

它不会阻止事件循环,因为对于每个请求,fibo worker将在一个单独的后台线程中并行运行。