2013-07-05 30 views
0

如果节点只有两个线程,一个执行主代码,另一个执行所有回调,如果回调是资源/时间密集型的,那么阻塞仍然会发生。在node.js中如何实现事件循环?

假设您拥有100,000个并发用户,并且对节点应用程序的每个客户端请求都会运行复杂且耗时的数据库查询(假设没有缓存完成),以后的用户在等待查询返回时会遇到阻塞情况吗?

function onRequest(request, response) { 
    //hypothetical database call 
    database.query("SELECT * FROM hugetable", function(data) { 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.write("database result: " + data); 
    response.end(); 
    });  
} 

http.createServer(onRequest).listen(8888); 

如果每个回调可以在其自己的线程上运行,那么这是一个非问题。但是,如果所有的回调都在一个单独的专用线程上运行,那么在这种情况下节点并没有真正帮助我们。

回答

0

请阅读这篇好文章:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ 没有多个线程,只有一个执行你的node.js逻辑。 (幕后I/O不应该被考虑用于应用程序逻辑)

对数据库的请求也是异步的 - 你所做的是将查询放入队列以传输到db socket,然后其他所有事情都发生在幕后和它只会在数据库出现响应时才回调,所以不会阻塞应用程序逻辑。