异步实际上是如何在幕后工作的?

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要好得多。

我希望您觉得这很有用,而不是更令人困惑。

这篇关于异步实际上是如何在幕后工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

本文给大家介绍Javascript js中实现和PHP一样的时间戳格式化函数的方法,具有一定的参考借鉴价值,需要的朋友可以参考下,我们知道在php中有一个date()函数,可以方便的把时间戳格式化为时间字符串。可是在js中,我们要想实现这种效果,要写好
需求是模板字符串中不允许出现script 标签、不允许有javascript: 和 .js 文件引用,主要方法如下: clearScriptTag (str) { const reg = /script[^]*([\S\s]*?)\/script/gim; // 清除标签内 相关 xss 安全代码 const reg1 = /javascript:/gim; const reg2 = / *.js/gim; if (reg.test(str)) { str
javascript中Replace全部替换字符用法实例代码,替换1次和多次,主要是正则表达式 var r= "1\n2\n3\n";//将字母\n替换成分号alert(r.replace("\n",";"));//结果:1;2\n3\n 只替换了第一个var r= "1\n2\n3\n";//将字母\n替换成分号alert(r.replace(/\n/g, ";"));//结果:1;2;3; replac
js输出当前日期和时间的实例代码,具体实例代码如下,有兴趣的朋友可以尝试运行下。 !doctype htmlhtml lang="en" head meta charset="UTF-8" title获取当前时间/title /head body script type="text/javascript" /** *获取当前时间 *format=1精确到天 *format=2精确到秒 */ function
p5.js WebGL 3d graphics covered by 2d background when rotated(P5.js旋转时被2D背景覆盖的WebGL 3D图形)
Static vector field with classic arrows at every point on p5.js(P5.js上每个点都有经典箭头的静态向量场)