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

Posted

技术标签:

【中文标题】实际情况下的异步请求处理如何工作?【英文标题】:How async request handling in real cases works? 【发布时间】:2019-01-04 11:00:53 【问题描述】:

我看到的大多数 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】:

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

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

    请注意,当调用 doSomethingAsync 时,调用堆栈或多或少类似于:

    doSomethingAsync 处理请求 一些框架方法 ... 一些框架方法

    doSomethingAsync 返回后(异步操作仍在等待中)handleRequest 也返回,所有框架堆叠的方法也可以返回,但尚未调用回调。当异步操作完成时,将使用一个明确的调用堆栈调用回调(对于节点 - 对于 ReactPHP,您还将在堆栈中调用事件循环)。

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

    当事件循环任务队列变空,但仍有异步操作挂起时,事件循环可能会根据事件循环实现选择空闲一段时间,直到其中一个异步操作完成。

【讨论】:

哇!感觉就像,你刚刚为我的问题写了一本书 :) 非常感谢!

以上是关于实际情况下的异步请求处理如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

处理AFNetworking2.0异步HTTP请求

改进异步封装:处理带返回值的异步调用

angularjs $q$http 处理多个异步请求

ASP.NET WebForm 之 Ajax 请求后端处理

Spring Boot Async 方法如何使用 ThreadPool 处理请求

服务器如何异步处理请求