NodeJS使用事件驱动模型,其中只有一个线程执行事件。我理解第一个执行的事件将是用户JS代码。来自网络服务器的nodeJS网站的简单示例在
之下var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
执行的第一个事件将执行上述步骤。稍后事件循环将等待事件入队。我的问题是哪个线程入队事件?是否有一个单独的线程可以做到这一点?如果是,多个线程也可以将事件排队吗?
谢谢。
答案 0 :(得分:0)
我的问题是哪个线程将事件排入队列?是否有一个单独的线程可以做到这一点?如果是,多个线程也可以将事件排队吗?
在它的核心,javascript解释器是围绕select()
系统调用的循环。 select()
系统调用通知操作系统有关程序感兴趣的文件句柄,操作系统将阻止程序的执行,直到任何文件句柄出现事件为止。基本上,如果您的程序感兴趣的某些I / O频道上有数据,select()
将返回。
在伪代码中,它看起来像这样:
while(1) {
select(files_to_write,files_to_read,NULL,NULL,timeout)
process_writable(files_to_write)
process_readable(files_to_read)
timeout = process_timers()
}
这个单一函数允许解释器实现异步I / O和setTimeout
/ setInterval
。 (从技术上讲,这只是部分正确.Node.js使用select或poll或epoll等基于可用的功能以及哪些功能在您的操作系统上更有效)
那么,谁将事件排成队?操作系统。
有一个例外。 node.js上的磁盘I / O由单独的线程处理。因此,对于这个I / O,这个磁盘I / O线程将事件排入事件循环。
它可以在没有线程的情况下实现。例如,Tcl编程语言(早于javascript但也有内置事件循环)使用诸如kqueue(在基于BSD的操作系统,如MacOS)或aio(在Linux和其他几个)上的功能在主线程中实现磁盘I / O.操作系统)或重叠的i / o(Windows)。但是node.js开发人员只是选择了线程来处理磁盘i / o。
有关C级别的更多信息,请参阅以下答案:I know that callback function runs asynchronously, but why?