了解NodeJS中的事件驱动

考虑这个简单的例子:

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。 但在这种情况下,第二个客户端只收到第一个睡觉后的花,对吧?

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

这是正确的,假设你正在做连续五秒的同步操作。 如果你做任何文件系统的IO,或任何IO的事情,或使用setTimeout,那么另一个客户端将有机会使用线程,并获得花的形象。 所以,如果你正在做大量的CPU密集处理,你有几个select:

  1. 使用内置的child_process模块​​在asynchronous运行的独立进程中启动它
  2. 跟踪你已经处理多久,每隔100毫秒左右,通过保存状态放弃线程,然后使用setTimeout继续处理你离开的地方
  3. 已经有多个节点进程正在运行,所以如果一个进程忙,还有另一个进程可以服务于第二个用户(EG,位于负载平衡器之后,或使用集群模块)

如果这是一个问题,我会推荐1和3的组合。 但是非常less的节点可以做成asynchronous的。 即使像计算密码哈希的事情可以asynchronous完成

不 – 这两个请求将被独立处理。 所以,如果第一个请求必须等待5秒钟,由于某种原因,第二个请求只需要2秒,第二个请求会在第一个请求之前返回。

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