Nis*_*ava 9 javascript node.js dom-events
我试图了解同步事件多路分解如何成为繁忙等待的解决方案.
假设有3个IO操作,我们有一个不断循环的代码,以检查3个操作中是否有任何数据可供读取.
arry = [event1 , event2 , event3]
while(arry is not empty)
{
for(i = 0 ; i <= 2 ; i++)
{
if(arry[i] has something to read)
{
read data;
}
else
{
continue to next i;
}
if(arry[i] read has finished){
remove i from arry
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的伪代码忙着等待.
现在在同步事件多路分解或说反应器模式中,事件监听器在事件发生时响应事件.但事件监听器怎么能在没有忙等待的情况下做到这一点呢?
进程是已执行的计算机程序的实例(执行任务或模块)。在单个进程中,我们可以有多个称为线程的组件。您可以将线程想象为一个待办事项列表,其中包含一些需要由计算机的 CPU 执行的指令。将线程视为工作者。
想象一下您有一套 10 层的公寓。你有一个有指示的工作人员,它必须挨家挨户地敲门才能收集数据。在忙碌的等待中,这个可怜的工人从一楼开始,敲每一扇门,检查数据是否准备好接收。它将一直执行到顶层。然后它会向下执行相同的过程。这次它将跳过之前已经接收到数据的门。所以它会一直上下运行,直到收到每个门的数据。这基本上就是忙碌的等待。
正如你所看到的,使用单线程,我们可以处理不同的资源而不会阻塞。然而这样的效率并不高,它会让CPU消耗大量内存并导致上下文切换,这对CPU来说是额外的辛苦工作。而且,线程会将大部分时间浪费在等待上,在等待的同时,CPU仍然在工作。
为什么事件多路分解是一种解决方案或更有效?
代替所有这些繁重的工作,我们的单线程将不会上下运行。它不再是一个工人,它现在是一个经理,并得到 libuv 库的额外支持,该库使用 C++ 的力量。Libuv将使用事件多路分离器收集所有数据,多路分离器将包括哪些数据来自哪个门以及如何处理这些数据,然后它将必要的数据传递到事件队列,然后事件队列将控制权传递给事件循环。现在事件循环的工作只是检查是否有等待事件,如果有,它会将其推送到调用堆栈,这是函数执行的地方。
事件多路分解器之所以被称为同步,是因为它不会同时敲两扇门。
用简单的方式解释这个复杂的主题确实很难。我希望它有帮助。
这不是 JS 中的工作方式。
当您发出一些可能会触发异步通知的请求时,您必须提供一个回调,该回调将以请求结果作为参数进行调用。
你的伪代码宁愿看起来像:
// request completion callback
function handle_request_notification (request status and associated data)
{
store request data wherever you like
if all requests are complete (without error), do what you want to do
(now that you have a complete set of data)
}
// issuing requests
do_request (whatever1, handle_request_notification)
do_request (whatever2, handle_request_notification)
do_request (whatever3, handle_request_notification)
Run Code Online (Sandbox Code Playgroud)
所以基本上,它是处理异步请求的库,当实际有东西要读取(或请求失败)时,它将激活所需的代码位。
每个特定的库都有自己的方法来做到这一点。
您可以先看一下 Ajax,它可能是所有 JS 异步库之母。
或者,如果您想要更简单的东西来学习基础知识,只需使用计时器:)
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |