了解NodeJS中的事件驱动

时间:2015-12-04 17:59:53

标签: javascript node.js

考虑这个简单的例子:

var BinaryServer = require('../../').BinaryServer;
var fs = require('fs');

// Start Binary.js server
var server = BinaryServer({port: 9000});
// Wait for new user connections
server.on('connection', function(client){
  // Stream a flower image!
  var file = fs.createReadStream(__dirname + '/flower.png');
  client.send(file); 
  sleep_routine(5);//in seconds
});

当客户端连接到服务器时,我阻止该事件大约5秒钟(假设时间有一些复杂的操作)。如果另一个客户连接(同时),会发生什么?我读到的关于NodeJS的一件事是非阻塞I / O.但在这种情况下,第二个客户只会在第一个客户睡觉后收到花,对吧?

2 个答案:

答案 0 :(得分:2)

  

我读到的关于NodeJS的一件事是非阻塞I / O.但在这种情况下,第二个客户只会在第一个客户睡觉后收到花,对吧?

这是正确的,假设您正在连续五秒阻止同步操作。如果您执行任何文件系统IO或任何IO,或使用setTimeout,那么另一个客户端将有机会使用该线程并获取花图像。所以,如果您正在进行非常繁重的CPU密集处理,那么您有几个选择:

  1. 在异步运行的单独进程中触发它,EG使用内置的child_process模块​​
  2. 通过保存状态,然后使用setTimeout继续处理停止的地方,跟踪您已经处理了多长时间并且每100毫秒左右放弃线程
  3. 已经有多个节点进程正在运行,因此如果一个正在运行,则有另一个可以为第二个用户提供服务(EG。在负载均衡器后面,或者使用集群模块)
  4. 如果这是一个问题,我会建议1和3的组合;但很多节点可以异步生成。甚至像computing password hashes can be done asynchronously

    这样的东西

答案 1 :(得分:0)

否 - 这两个请求将被独立处理。因此,如果第一个请求必须等待5秒,并且由于某种原因,第二个请求只需要2秒,第二个请求将在第一个请求之前返回。

在实践中,您将在第一次完成之前第二次调用服务器连接。但由于他们拥有所有不同的状态,你通常不会意识到这一点。