我对Node js的架构和性能有疑问.
我已经完成了一些关于这个主题的阅读(包括Stack Overflow),我还有几个问题.我想做两件事:
Node具有单线程,异步事件处理架构
单线程 - 有一个事件线程可以调度异步工作(结果通常是I/O但可以是计算)并执行回调执行(即处理异步工作结果).
事件线程在无限的"事件循环"中运行,执行上述2个作业; a)通过调度异步工作来处理请求,以及b)注意先前的异步工作结果已准备好并执行回调以处理结果.
这里的常见类比是餐厅订单接收者:活动线程是一个超级快速的服务员,从餐厅接受订单(服务请求)并将订单发送到厨房准备(发送异步工作),但也注意到当食物准备就绪(异步结果)并将其送回表格(回调执行).
服务员不做任何食物; 他的工作是尽快从餐厅到厨房来回走动.如果他陷入餐厅的订单陷入困境,或者如果他被迫回到厨房准备其中一餐,系统就变得效率低下并且系统吞吐量受损.
异步 由请求(例如Web请求)产生的异步工作流在逻辑上是一个链:例如
FIRST [ASYNC: read a file, figure out what to get from the database] THEN
[ASYNC: query the database] THEN
[format and return the result].
Run Code Online (Sandbox Code Playgroud)
上面标有"ASYNC"的作品是"厨房工作","FIRST []"和"THEN []"代表服务员开始回调的参与.
像这样的链以3种常见方式以编程方式表示:
嵌套函数/回调
用.then()链接的承诺
async()异步结果的异步方法.
所有这些编码方法都非常相同,尽管asynch/await似乎是最干净的,并且使得异步编码的推理更容易.
问题
我的问题涉及使用OS支持的异步操作,实际执行异步工作的人,以及这种体系结构比"按每个请求生成一个线程"(即多个cooks)体系结构更高效的方式:
通过使用跨平台异步库libuv设计节点库是异步的,对吗?这里的想法是libuv为节点(在所有平台上)提供一致的异步I/O接口,但随后使用平台相关的异步I/O操作吗?在I/O请求"一直向下"到OS支持的异步操作的情况下,谁正在"做工作"等待I/O返回并触发节点?它是内核,使用内核线程吗?如果不是,谁?无论如何,这个实体可以处理多少个请求?
我已经读过libuv也在内部使用了一个线程池(通常是pthreads,每个核心一个?).这是为了"包装"不像"async"那样"完全向下"的操作,这样一个线程就可以用来等待同步操作了,所以libuv可以提供一个异步API吗?
关于性能,用于解释类似节点的体系结构可以提供的性能提升的通常说明是:画出(可能更慢和更胖)线程每请求方法 - 产生的延迟,CPU和内存开销一堆线程只是坐在等待I/O完成(即使他们没有忙碌等待)然后将它们拆除,节点很大程度上让它消失了,因为它使用了一个长期存在的事件线程来将异步I/O发送到OS /内核,对吗?但是在一天结束的时候,SOMETHING正在睡眠互联网并在I/O准备就绪时被唤醒...是否认为内核比用户线程更有效?最后,请问由libuv的线程池处理的情况怎么样...这似乎与每个请求线程的方法类似,除了使用池的效率(避免启动和拆除),但是在这种情况下,当有很多请求并且池有积压时会发生什么?...延迟增加,现在你做的比每个请求的线程更糟,对吧?
我决定熟悉node.js并阅读了几篇关于这个主题的文章.我还不清楚的是,当您调用node.js函数时,node.js是否在线程池中创建新线程和/或调度线程池上的任务.
例如,如果我调用fs.readFile它是在另一个线程上执行的?
如果是,[how]我可以编写自己的函数readFileCustomized还是doLongOperation在不同的线程上运行?
Node.js服务器适用于支持回调函数的基于事件的模型.但我无法理解它比线程等待系统IO的传统线程服务器更好.在基于线程的模型的情况下,当线程需要等待IO时,它被抢占,因此不消耗CPU周期因此不会导致等待时间.
Node.js如何改善等待时间?
我试图找出一个有效的算法来改变一堆节点上的很多类,我发现我对javascript如何遍历DOM有一个很大的漏洞.
浏览器/ javascript是否使用像闪存一样的弹性赛道?或者它是更多的事件驱动,每次有变化时重绘整个显示?
"弹性跑道"是一个闪光范例,你可以想象一个闪光环绕的大环.在用户处理期间,时间变化积累,并且在闪存处理期间,闪存引擎会四处奔跑并一遍又一遍地应用所有更改.
替代方案是一个事件模型,每次属性更改时,整个屏幕都会重新绘制 - 这可能是浏览器所做的,但我不确定.
我可以想到混合算法,如果没有任何变化,没有任何事情发生 - 但如果有它们被允许建立 - 有点像我的水槽上的菜.
有没有人能够快速描述用于处理属性更改和DOM插入的算法.
我一直在思考像 React 这样的代码和库,它们可以自动对发生的事件做出反应,并且想知道所有这些是如何在 C++ 和机器代码的较低级别实现的。
我似乎无法想出任何其他方式可以使用 if not with while loop 在另一个线程上运行来实现诸如事件侦听器之类的东西。
那么这一切都在幕后吗?只是 while 一直循环下去?例如,RethinkDB 将自己宣传为具有repubsub库的“实时数据库” 。“订阅”方法是否只是在后台使用 while 循环实现的?我似乎无法找到任何相关信息。
像,插座之类的,也是。当计算机在端口上“侦听”套接字连接时,该计算机是否正在运行类似以下内容:
while(1) {
if (connectionFound) {
return True;
}
}
Run Code Online (Sandbox Code Playgroud)
或者有什么我想念的吗?
javascript ×4
node.js ×3
algorithm ×1
async-await ×1
asynchronous ×1
dom ×1
events ×1
loops ×1
performance ×1
reactjs ×1
rethinkdb ×1