实际案例中的异步请求处理是如何工作的?
How async request handling in real cases works?
我看到的大多数关于 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-其中Core/Thread是EventLoop 运行ning?它是否独立于请求线程。如果不是,我们如何不松散 Eventloop 过程?如果套接字返回一个值,谁在控制它(Thread/Core)? EventLoop 是否可能每秒 运行ning 来检查回调? (我想,不管它有多快,但机器代码是 运行宁线性同步(一个接一个))
事件循环允许您的应用程序在第一个请求仍在处理时响应第二个请求。这是可能的,因为所有 I/O 操作都需要一个回调,该回调将在操作完成时执行。 Node.js 和 PHP 只能 运行 一个线程(本机),但可以将其视为一次只能有一个调用堆栈。请注意,当您将回调传递给函数时,您允许清除整个调用堆栈,因此,您还允许另一个代码 运行。示例:
function callback (result) {
console.log(result);
}
function handleRequest (request) {
doSomethingAsync(callback);
}
请注意,调用 doSomethingAsync 时,调用堆栈或多或少类似于:
- doSomethingAsync
- 处理请求
- 一些框架方法
- ...
- 一些框架方法
doSomethingAsync后returns(async操作还在pending)handleRequest也returns,所有的framework stacked methods也可以return,但是callback还没有叫了。当异步操作完成时,将使用清晰的调用堆栈调用回调(在节点的情况下 - 对于 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-其中Core/Thread是EventLoop 运行ning?它是否独立于请求线程。如果不是,我们如何不松散 Eventloop 过程?如果套接字返回一个值,谁在控制它(Thread/Core)? EventLoop 是否可能每秒 运行ning 来检查回调? (我想,不管它有多快,但机器代码是 运行宁线性同步(一个接一个))
事件循环允许您的应用程序在第一个请求仍在处理时响应第二个请求。这是可能的,因为所有 I/O 操作都需要一个回调,该回调将在操作完成时执行。 Node.js 和 PHP 只能 运行 一个线程(本机),但可以将其视为一次只能有一个调用堆栈。请注意,当您将回调传递给函数时,您允许清除整个调用堆栈,因此,您还允许另一个代码 运行。示例:
function callback (result) { console.log(result); } function handleRequest (request) { doSomethingAsync(callback); }
请注意,调用 doSomethingAsync 时,调用堆栈或多或少类似于:
- doSomethingAsync
- 处理请求
- 一些框架方法
- ...
- 一些框架方法
doSomethingAsync后returns(async操作还在pending)handleRequest也returns,所有的framework stacked methods也可以return,但是callback还没有叫了。当异步操作完成时,将使用清晰的调用堆栈调用回调(在节点的情况下 - 对于 ReactPHP 你也会在堆栈中调用事件循环)。
事件循环持有一个待处理任务队列,只有当前一个任务完成时它才会启动一个任务。当您调用异步函数时,您是在间接地将一个新任务添加到事件循环任务队列中。因此,当前任务必须完成才能完成异步操作。同样重要的是要了解事件循环永远不会中断任务来调用回调。回调仅在前一个任务完成时调用(即调用堆栈变为空)。
当事件循环任务队列变空,但仍有未决的异步操作时,事件循环可能会选择空闲一段时间,具体取决于事件循环的实现,直到其中一个异步操作完成。