gpt4 book ai didi

javascript - NodeJS 中的事件队列

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:09 25 4
gpt4 key购买 nike

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/');

执行的第一个事件将执行上述步骤。稍后,事件循环将等待事件入队。我的问题是哪个线程将事件排队?是否有一个单独的线程可以做到这一点?如果是,多个线程也可以将事件排队吗?

谢谢。

最佳答案

My question is which thread enqueues event? Is there are a separate thread that does that? If yes can multiple threads enqueue events also?

JavaScript 解释器的核心是围绕 select() 的循环。系统调用。 select() 系统调用向操作系统通知您的程序感兴趣的文件句柄,并且操作系统将阻止您的程序执行,直到这些文件句柄中的任何一个发生事件为止。基本上,如果您的程序感兴趣的某个 I/O channel 上有数据,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 等)

那么,谁对事件进行排队?操作系统。

<小时/>

有一个异常(exception)。 Node.js 上的磁盘 I/O 由单独的线程处理。因此,对于此 I/O,正是该磁盘 I/O 线程将事件排队到事件循环中。

它可以在没有线程的情况下实现。例如,Tcl 编程语言(早于 javascript,但也具有内置事件循环)使用 kqueue(在基于 BSD 的操作系统,如 MacOS)或 aio(在 Linux 和其他几个操作系统上)或重叠 i/o (Windows) 等功能在主线程中实现磁盘 I/O。但 Node.js 开发人员只是选择线程来处理磁盘 I/O。

<小时/>

有关 C 级别如何工作的更多信息,请参阅此答案:I know that callback function runs asynchronously, but why?

关于javascript - NodeJS 中的事件队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com