首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解NodeJS中的事件驱动

理解NodeJS中的事件驱动
EN

Stack Overflow用户
提问于 2015-12-04 17:59:53
回答 2查看 146关注 0票数 1

考虑一下这个简单的例子:

代码语言:javascript
复制
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,但是在这种情况下,第二个客户端只在第一个客户睡后才收到花,对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 18:27:01

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

这是正确的,假设您正在连续5秒地阻塞同步操作。如果您执行任何文件系统IO或任何IO操作,或使用setTimeout,则其他客户端将有机会使用线程并获取花映像。因此,如果您正在进行非常繁重的cpu密集型处理,那么您有几个选择:

  1. 在异步运行的单独进程中启动它,EG使用内置的child_process模块。
  2. 记录您已经处理了多长时间,并且每隔100 to左右通过保存状态来放弃线程,然后使用setTimeout继续处理所中断的线程。
  3. 有多个节点进程已经在运行,因此如果一个节点很忙,就有另一个节点进程可以为第二个用户(EG )服务。负载均衡器后面,或使用集群模块)

如果这是一个问题,我建议将1和3组合在一起;但是有那么多节点是异步的,所以很少是异步的。即使是像计算密码散列可以异步完成。这样的东西

票数 2
EN

Stack Overflow用户

发布于 2015-12-04 18:16:30

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34094558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档