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

标签 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 是否可能每秒运行一次以检查回调? (我想,不管它有多快,但机器代码正在运行线性同步(一个接一个))

最佳答案

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

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

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

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

    doSomethingAsync返回后(异步操作仍待处理)handleRequest也返回,所有框架堆叠的方法也可以返回,但回调尚未调用。当异步操作完成时,将使用清晰的调用堆栈调用回调(如果是 Node - 对于 ReactPHP,您还将在堆栈中调用事件循环)。

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

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

关于javascript - 实际情况下的异步请求处理如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037677/

相关文章:

php - 如何在同一 iframe 中打开目标为 =“_blank” 的 iframe 中的链接?

EXT 中的 JavaScript

ios - UITableView 延迟加载的图像在手指关闭之前不会加载

javascript - 提交无按钮表单时如何触发函数

javascript - JavaScript 中日期对象创建失败

javascript - 是否可以在node.js中使用affdex-sdk并将情感数据保存到mongodb?

javascript - 每第二次运行都会抛出 : MongoError: Topology was destroyed

javascript - 如何将lean()与 Mongoose 和 Bluebird 一起使用?

php - 为什么只有 ASP.NET 有异步编程模型?

点击函数中的Javascript数组长度