栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

单线程无阻塞IO模型在Node.js中的工作方式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单线程无阻塞IO模型在Node.js中的工作方式

Node.js建立在libuv上,libuv是一个跨平台的库,它为支持的操作系统(至少为Unix,OS
X和Windows)提供的异步(非阻塞)输入/输出抽象api / syscall。

异步IO

在此编程模型中,对由文件系统管理的设备和资源(套接字,文件系统等)的打开/读取/写入操作 不会阻塞调用线程
(如在典型的类似c的同步模型中),而只是标记新数据或事件可用时,将通知进程(在内核/
OS级数据结构中)。如果是类似Web服务器的应用程序,则该过程负责确定通知事件属于哪个请求/上下文,并从那里继续处理请求。请注意,这必然意味着您将与向OS发起请求的堆栈位于不同的堆栈框架上,因为OS必须屈服于进程的调度程序才能使单线程进程处理新事件。

我描述的模型的问题在于,它对程序员不熟悉并且很难推理,因为它本质上是非顺序的。“您需要在函数A中发出请求,并在另一个函数中处理结果,而通常情况下,您无法使用A中的本地人。

节点的模型(继续传递样式和事件循环)

Node通过诱使程序员采用某种编程风格,利用javascript的语言功能解决了该问题,使该模型看起来更具同步性。每个请求IO的功能都具有类似的签名,

function(... parameters ...,callback)
并且需要给其提供一个回调,该回调将在请求的操作完成时被调用(请注意,大部分时间都在等待OS发出完成信号,这是可以花费的时间)。花了其他工作)。Javascript对闭包的支持使您可以使用在回调主体内的外部(调用)函数中定义的变量-
这样可以保留节点运行时将独立调用的不同函数之间的状态。另请参见继续传递样式。

而且,在调用产生了IO操作的函数之后,调用函数通常将

return
控制到节点的 事件循环
。该循环将调用计划执行的下一个回调或函数(很可能是因为相应的事件已由OS通知)-这允许并发处理多个请求。

您可以认为节点的事件循环 有点类似于内核的调度程序 :内核将在其未完成的IO完成后调度执行阻塞的线程,而节点将在发生相应事件时调度回调。

高度并发,无并行

最后,短语“除了代码之外的所有内容并行运行”在捕捉节点允许您的代码通过多路复用和排序所有js并发处理 单个线程 同时处理来自 成千上万个开放套接字的
请求这一点上做得不错单个执行流中的逻辑(即使说“一切并行运行”在这里可能不正确-。这对于webapp服务器非常有效,因为实际上大部分时间都花在等待网络或磁盘(数据库/套接字)上,并且逻辑实际上并不占用CPU过多的资源-也就是说: 这对于IO绑定的工作负载非常有效



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381291.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号