相关疑难解决方法(0)

单线程非阻塞IO模型如何在Node.js中工作

我不是Node程序员,但我对单线程非阻塞IO模型的工作原理感兴趣.在我阅读了文章理解-node-js-event-loop之后,我真的很困惑.它给出了该模型的一个例子:

c.query(
   'SELECT SLEEP(20);',
   function (err, results, fields) {
     if (err) {
       throw err;
     }
     res.writeHead(200, {'Content-Type': 'text/html'});
     res.end('<html><head><title>Hello</title></head><body><h1>Return from async DB query</h1></body></html>');
     c.end();
    }
);
Run Code Online (Sandbox Code Playgroud)

这是一个问题.当有两个请求A(至上)和B,由于只有一个线程,服务器端程序将处理请求的第一:做SQL查询这是一个睡眠声明站立I/O等待.并且程序停留在I/O等待,并且无法执行呈现网页的代码.程序会在等待期间切换到请求B吗?在我看来,由于单线程模型,没有办法从一个请求切换另一个请求.但是示例代码的标题说"除了代码之外,所有内容都是并行运行".(PS我不确定我是否误解了代码,因为我从未使用过Node.)节点如何在等待期间切换到B?你能用一种简单的方法解释Node的单线程非阻塞IO模型吗?如果你能帮助我,我将不胜感激.:)

node.js

323
推荐指数
5
解决办法
10万
查看次数

为什么Node.js是单线程的?

在基于PHP(或Java/ASP.NET/Ruby)的Web服务器中,每个客户端请求都在新线程上实例化.但是在Node.js中,所有客户端都运行在同一个线程上(它们甚至可以共享相同的变量!)我知道I/O操作是基于事件的,所以它们不会阻塞主线程循环.

我不明白的是为什么Node的作者选择它是单线程的?这让事情变得困难.例如,我无法运行CPU密集型功能,因为它阻塞了主线程(并阻止了新的客户端请求),因此我需要生成一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程) ).但是在PHP中,cpu密集型任务不会阻止其他客户端,因为我提到每个客户端都在不同的线程上.与多线程Web服务器相比,它有哪些优势?

注意:我已经使用群集来解决这个问题,但它并不漂亮.

node.js

240
推荐指数
3
解决办法
11万
查看次数

NodeJS真的是单线程吗?

Node.js通过将基于事件的模型放在其核心,使用事件循环而不是线程来解决"每个连接一个线程问题".所有昂贵的I/O操作总是与启动的操作完成时执行的回调异步执行.

如果任何操作发生的观察由epoll()等多路复用机制处理.

我的问题现在是:

  • 为什么在使用阻塞Systemcalls select/epoll/kqueue时NodeJS阻塞?

  • 或者根本不是NodeJS Single Threaded,所以需要第二个Thread
    来观察select/epoll/kqueue的所有I/O操作?

architecture multithreading node.js

59
推荐指数
2
解决办法
1万
查看次数

标签 统计

node.js ×3

architecture ×1

multithreading ×1