我不是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病毒,它正在编程世界中迅速传播.
我对它的"非阻塞IO"方法很着迷,并且我自己也试过了几个程序.
但是,我目前无法理解某些概念.
我需要外行术语的答案(有人来自Java背景)
1.多线程和非阻塞IO.
让我们考虑一个实际的场景.比如,我们有一个用户可以注册的网站.下面是代码.
..
..
// Read HTTP Parameters
// Do some Database work
// Do some file work
// Return a confirmation message
..
..
Run Code Online (Sandbox Code Playgroud)
在传统的编程语言中,上述顺序发生.并且,如果有多个注册请求,则Web服务器会创建一个新线程,其余的都是历史记录.当然,程序员可以创建自己的线程,同时在第2行和第3行上工作.
在Node中,据我所知,第2行和第3行将并行运行,而程序的其余部分将被执行,解释器每隔'x'ms轮询第2行和第3行.
现在,我的问题是,如果Node是单线程语言,那么在执行程序的其余部分时,第2行和第3行的工作是什么?
2.可扩展性
我最近读到LinkedIn已经将Node作为其移动应用程序的后端进行了调整,并且已经看到了巨大的改进.
任何人都可以解释它是如何产生这样的差异的?
3.适应其他编程语言
如果人们声称Node在性能方面有很大的不同,为什么其他编程语言没有采用这种非阻塞IO范例呢?
我确定我错过了什么.只有你能解释我并指导我一些链接,才会有所帮助.
谢谢.