在实际情况下,异步请求处理如何工作?

时间:2019-01-04 11:00:53

标签: javascript node.js asynchronous asyncsocket reactphp

我所见过的关于 Node JS / ReactPHP 的大多数教程更像是,您不需要等待5秒钟的计时器来回显某些内容。 EventLoop可以稍后处理。

像下面的示例一样(请注意,这与语言无关):

timer(run 5 seconds later){
    print 'username';
}
print ', another text';

// non A-Sync output is like = 'username, another request'
// A-Sync output is like = ', another requestusername'

但这是我们正在处理的同一文件。如果我们连接到I / O插槽该怎么办。

类似于此示例:(requestfile.js)

connectSocket(takes 5 seconds to return a result){
    print result;
}

//end of the file

好吧,我在这里有2个问题(对reactphp或nodejs而言无关紧要,对我而言异步无关)

1-如果我们收到2个用户请求,则第一个请求连接并等待5秒钟,A-Sync可以在等待第一个请求的响应回调的同时,在同一线程中运行第二个请求。 (或者仅表示异步,您可以在同一文件内执行独立操作,例如:在连接此套接字5秒钟时打印页脚)

2- EventLoop在哪个内核/线程中运行?它独立于请求线程。如果不是,我们如何不松开Eventloop流程?如果套接字返回一个值,那么(线程/核心)是谁控制的? EventLoop可能每秒运行一次以检查回调吗? (我认为,速度有多快都没有关系,但是机器代码正在运行线性同步(一个接一个))

1 个答案:

答案 0 :(得分:0)

  1. 事件循环允许您的应用程序在第二个请求仍在处理中时对其进行应答。这是可能的,因为所有I / O操作都希望有一个回调,该回调将在操作完成后执行。 Node.js和PHP仅能(本地)运行一个线程,但可以将其视为一次只能具有一个调用堆栈。请注意,将回调传递给函数时,可以清除整个调用堆栈,因此,还可以运行其他代码。示例:

    function callback (result) {
        console.log(result);
    }
    
    function handleRequest (request) {
        doSomethingAsync(callback);
    }
    

    请注意,当调用doSomethingAsync时,调用堆栈看起来或多或少像:

    • doSomethingAsync
    • handleRequest
    • 一些框架方法
    • ...
    • 一些框架方法

    在doSomethingAsync返回(异步操作仍在执行中)之后,handleRequest也将返回,并且所有框架堆栈方法也可以返回,但是尚未调用回调。异步操作完成后,将使用一个清晰​​的调用堆栈来调用回调(对于节点-对于ReactPHP,您还将在堆栈中具有事件循环调用)。

  2. 事件循环包含一排待处理的任务,只有在前一个任务完成时才会启动一个任务。调用异步函数时,您是在事件循环任务队列中间接添加新任务。因此,当前任务必须完成才能完成异步操作。同样重要的是要了解事件循环永远不会中断任务来调用回调。仅当上一个任务完成时(即调用堆栈为空)才调用回调。

    当事件循环任务队列为空,但仍有异步操作挂起时,事件循环可能会选择空闲一段时间,具体取决于事件循环的实现,直到其中一个异步操作完成为止。