Javascript NodeJS中的事件队列

Javascript NodeJS中的事件队列,javascript,node.js,event-loop,event-queue,Javascript,Node.js,Event Loop,Event Queue,NodeJS使用事件驱动模型,其中只有一个线程执行事件。我知道执行的第一个事件是用户JS代码。下面是一个来自Web服务器的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.

NodeJS使用事件驱动模型,其中只有一个线程执行事件。我知道执行的第一个事件是用户JS代码。下面是一个来自Web服务器的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/');
执行的第一个事件将执行上述步骤。稍后,事件循环将等待事件排队。我的问题是哪个线程排队事件?有没有一个单独的线程可以这样做?如果是,多线程是否也可以将事件排队

多谢各位

我的问题是哪个线程排队事件?有没有一个单独的线程可以这样做?如果是,多线程是否也可以将事件排队

javascript解释器的核心是围绕系统调用的循环。
select()
系统调用通知操作系统您的程序感兴趣的文件句柄,并且操作系统将阻止您的程序执行,直到这些文件句柄上出现事件为止。基本上,
select()
将返回程序感兴趣的某个I/O通道上的数据

在伪代码中,它看起来像这样:

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(在MacOS等基于BSD的操作系统上)或aio(在Linux和其他几个操作系统上)或重叠I/O(Windows)等功能实现磁盘I/O。但是node.js开发人员只是选择线程来处理磁盘i/o



有关如何在C级别执行此操作的更多信息,请参见以下答案:

不确定我是否了解它?它是一个事件处理程序,每当
http://127.0.0.1:1337/
执行事件回调。它仍然是单线程的,并且是事件驱动的?没有线程(只有一个例外)。下面是对发生的事情的低层次解释:我认为我的问题不清楚。我知道事件循环定义事件并执行它。但我想问的是排队的人是谁。如果我们考虑上面的例子,谁会听到这个请求,并且每当收到请求时,就调用回调。@ Ekhan:看我的答案:它是事件循环线程。这个解释有什么不清楚的地方吗?我认为这个答案有有趣的信息。为什么有人否决了我的答案?@traceformula我想在我改变答案之前,OP否决了我的答案。我之前的回答更多地关注于如何调用回调。他对事件循环如何获取事件更感兴趣。在我改变答案后,我认为OP并不满意,因为它的工作原理与他对计算机工作原理的世界观相冲突,所以他没有取消否决票。这当然是一个猜测,因为投票是匿名的。我强烈建议所有程序员(是的,甚至是PHP程序员)在汇编中编程(而不是x86汇编-这很可怕,可能是ARM或AVR),并尝试至少使用一次中断。一旦你了解了中断,你就会明白这类事情是如何运作的。线不是魔法。它们本身就是内核的事件。尝试汇编是好的。另外,我认为线程大部分不是内核的事件(线程在用户空间中)。正确的?