同步事件多路分解如何成为忙碌等待的解决方案?

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)

上面的伪代码忙着等待.

现在在同步事件多路分解或说反应器模式中,事件监听器在事件发生时响应事件.但事件监听器怎么能在没有忙等待的情况下做到这一点呢?

Yil*_*maz 9

进程是已执行的计算机程序的实例(执行任务或模块)。在单个进程中,我们可以有多个称为线程的组件。您可以将线程想象为一个待办事项列表,其中包含一些需要由计算机的 CPU 执行的指令。将线程视为工作者。

想象一下您有一套 10 层的公寓。你有一个有指示的工作人员,它必须挨家挨户地敲门才能收集数据。在忙碌的等待中,这个可怜的工人从一楼开始,敲每一扇门,检查数据是否准备好接收。它将一直执行到顶层。然后它会向下执行相同的过程。这次它将跳过之前已经接收到数据的门。所以它会一直上下运行,直到收到每个门的数据。这基本上就是忙碌的等待。

正如你所看到的,使用单线程,我们可以处理不同的资源而不会阻塞。然而这样的效率并不高,它会让CPU消耗大量内存并导致上下文切换,这对CPU来说是额外的辛苦工作。而且,线程会将大部分时间浪费在等待上,在等待的同时,CPU仍然在工作。

为什么事件多路分解是一种解决方案或更有效?

代替所有这些繁重的工作,我们的单线程将不会上下运行。它不再是一个工人,它现在是一个经理,并得到 libuv 库的额外支持,该库使用 C++ 的力量。Libuv将使用事件多路分离器收集所有数据,多路分离器将包括哪些数据来自哪个门以及如何处理这些数据,然后它将必要的数据传递到事件队列,然后事件队列将控制权传递给事件循环。现在事件循环的工作只是检查是否有等待事件,如果有,它会将其推送到调用堆栈,这是函数执行的地方。

事件多路分解器之所以被称为同步,是因为它不会同时敲两扇门。

用简单的方式解释这个复杂的主题确实很难。我希望它有帮助。


kur*_*eko 0

这不是 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 异步库之母。

或者,如果您想要更简单的东西来学习基础知识,只需使用计时器:)