how does asynchronous actually work under the hood..?(异步实际上是如何在幕后工作的?)
问题描述
我一直在研究多线程、回调、调度队列,以同步和异步的方式... 我研究得越多,我就越困惑和沮丧到了我似乎永远无法理解的地步。请有人能把我引向正确的方向开始吧。到目前为止,我发现的大多数信息都是关于IS的功能和优势。我真正想知道的是,当使用回调和单线程进行异步操作时,函数如何立即返回。 [这里]的(http://nathansjslessons.appspot.com/lesson?id=1085)我从哪里得到这个信息
The function **returns immediately** before the file is read and schedules the read to happen
sometime in the future. Once the data is ready, the callback function is called on the
data.
以下是如何使用常规阻塞读取函数获取文件内容的示例 Var读取文件=Function(){
var data;
data = read('file.txt');
dosomething('contect' + data);
}
下面是使用异步ReadAsync函数的相同示例。
var readFileAsynch = function () {
var func = function (x) {
// i can do something with data
dosomthing('content'+data);
}
**readAsynch('file.txt',func);**
dosomemorestuff();
};
据我所知,如果您使用的不是我认为的主线程,而是另一个线程,这就是执行异步的方式,如果您只有一个线程,那么异步是如何真正工作的?
而且,当涉及到目标c中的调度队列时,是否可以认为队列只是指向块或函数的指针数组,并且线程负责在应用程序中管理该队列?
我真的很抱歉我的问题很模糊,但我也是。 希望任何人谁可以提供一些源代码或实现,我可以阅读,以了解真正发生了什么。我厌倦了只读一些东西,比如"使用线程是非常昂贵的"……但以什么方式..?或者,我不需要知道它..?EDIT:那么ReadAsynch(‘file.txt’,func);如何与其他函数不同,从而将其称为Asynch..?为什么它可以在不等待上方的readAsynch函数的情况下立即执行doomemoreff,除非(我认为)当您调用readAsynch时,它是由另一个线程完成的。?
推荐答案
这完全取决于实现我的朋友,如果每个浏览器遵循语言规范,它们可以在幕后做任何他们想做的事情。
您不必担心线程之类的事情,但如果您担心,请记住这一点:
JavaScript不是一种"线程化"语言,它使用事件循环流,在该循环流中,触发一个事件,然后触发连续的函数,直到没有其他可调用的函数为止。这就是为什么在编写"好"的代码时,很难用JavaScript阻止用户界面的原因。
可以同时调用多个函数,而不会阻塞,这就是它的优点。函数的每次执行都有其自己的生存期,如果同时激发3个事件处理程序,则这3个事件处理程序将同时运行,而不是线性执行。
node.js是一个很好的例子,说明了它是如何工作的,以及事件循环和经典线程之间的区别,我给你一个例子:
假设您正在服务器上侦听请求,在请求到达2秒后,您将发送一条消息。现在让我们假设您复制该侦听器,并且两个侦听器执行相同的操作。如果您请求服务器,您将在请求发出后2秒同时收到这两条消息,而不是在2秒内收到一条消息,在4秒内收到另一条消息。这意味着两个监听程序同时运行,而不是像大多数系统那样遵循线性执行。异步意味着:您告诉某个服务(DOM、服务器等)来执行操作,并附加一个事件处理程序,一旦服务告诉您,我已经得到您想要的东西,或者我已经完成了您需要的东西,就会执行该事件处理程序。并且该处理程序在执行任何其他鼠标点击或按键时被执行。事件处理程序的链接可能会很痛苦,但我相信这比阻止UI要好得多。
我希望您觉得这很有用,而不是更令人困惑。
这篇关于异步实际上是如何在幕后工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:异步实际上是如何在幕后工作的?
基础教程推荐
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01
- 直接将值设置为滑块 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01