Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件循环、回调队列和Javascript’;什么是单线程连接? 总目标_Javascript_Asynchronous_Event Loop_Single Threaded_Event Queue - Fatal编程技术网

事件循环、回调队列和Javascript’;什么是单线程连接? 总目标

事件循环、回调队列和Javascript’;什么是单线程连接? 总目标,javascript,asynchronous,event-loop,single-threaded,event-queue,Javascript,Asynchronous,Event Loop,Single Threaded,Event Queue,我想知道javascript环境的以下部分如何作为一个系统互连 Javascript引擎 事件循环 事件队列 我们可以将此限制为浏览器环境,因为另一篇文章() 我(相信)理解的事情: Javascript是单线程的,因此只有一个调用堆栈 Javascript环境只提供少数真正异步的函数。这些可能包括setTimeout()、setInterval()和I/O函数 如果不使用其中一个函数,开发人员无法创建自己的异步函数 Javascript本身是同步运行的,但一旦清除当前调用堆栈,通过它的异

我想知道javascript环境的以下部分如何作为一个系统互连

  • Javascript引擎
  • 事件循环
  • 事件队列
我们可以将此限制为浏览器环境,因为另一篇文章()

我(相信)理解的事情:
  • Javascript是单线程的,因此只有一个调用堆栈

  • Javascript环境只提供少数真正异步的函数。这些可能包括setTimeout()、setInterval()和I/O函数

  • 如果不使用其中一个函数,开发人员无法创建自己的异步函数
  • Javascript本身是同步运行的,但一旦清除当前调用堆栈,通过它的异步函数可以回调可能的阻塞函数
例子: 示例步骤: (如果我错了,请纠正步骤)

  • 已记录“同步代码已启动…”
  • setTimeout被添加到堆栈中,但立即返回控制
  • setTimeout被发送到另一个“线程”…“工作线程”?在javascript的单线程之外计算2000毫秒
  • 已记录“同步代码已完成…”
  • 2000毫秒后,asyncLog()被推送到事件队列
  • 因为调用堆栈是清除的,所以事件循环检查事件队列中是否有挂起的回调
  • asyncLog()从队列中删除,并由事件循环推送到堆栈中
  • 记录“异步功能已完成”
  • 调用堆栈现在已清除
  • 问题 如果有人能够概述异步函数(如setTimeout)从第一次命中调用堆栈到被回调回调用堆栈的过程,那么不需要逐一回答这些问题

  • 在步骤3中,谁生成了这个新线程?是浏览器吗?
    • 正在阻止此新线程,对吗
    • 如果您有一个创建1000个设置超时的循环,会发生什么。是否创建了1000个“线程”
    • 一次可以生成多少线程有限制吗
    • 当新线程完成执行时,它如何在队列中结束
  • 谁提供事件队列
  • 谁提供事件循环?
    • 事件循环是否轮询事件队列
    • javascript的线程是否知道事件循环?或者事件循环只是把东西推到堆栈上
    • 事件循环如何知道堆栈何时清除

  • 您的理解和示例似乎基本正确。现在,请回答您的问题:

    在步骤3中,谁生成了这个新线程?是浏览器吗

    对。它基本上是为那些“真正的异步”函数提供实现的东西。IIRC,
    setTimeout
    直接在JS引擎中实现,而网络IO肯定是浏览器的责任——但谁创建它们并不重要。最后,在“浏览器环境”中,它始终是浏览器的一部分

    正在阻止此新线程,对吗

    对。否。这取决于需要完成的工作,即调用哪个异步函数。有些可能需要旋转一个新线程,但对于简单的超时,我非常确定使用了非阻塞系统调用

    如果您有一个创建1000个设置超时的循环,会发生什么。是否创建了1000个“线程”

    可能。不过不太可能。我假设对于那些真正需要自己的线程的异步操作,会使用线程池,并且请求会排队。此池的大小可能隐藏在浏览器配置的内部

    一次可以生成多少线程有限制吗

    这将由操作系统控制

    当新线程完成执行时,它如何在队列中结束?谁提供事件队列

    基本上,每个此类线程的最后一个操作是将其结果放入事件队列中

    谁提供事件循环?事件循环是否轮询事件队列

    我认为这是一个实现细节,无论循环轮询队列还是队列驱动循环迭代

    javascript的线程是否知道事件循环?或者事件循环只是把东西推到堆栈上

    我认为javascript在事件循环线程中运行。事件循环只是重复地从队列中弹出事件并执行它们的javascript

    事件循环如何知道堆栈何时清除


    事件循环调用javascript执行-因此当javascript返回时堆栈是清晰的。

    我花了一段时间才意识到这些都是我问题的好答案。我觉得一些关于浏览器如何处理JS引擎的漂亮图片会让社区受益匪浅。Phillip Roberts关于事件循环的演讲在许多方面也提供了丰富的信息。您好,我有一个关于原始帖子中异步部分“开发人员无法创建自己的异步函数”的问题,如果您能看一看,将不胜感激:@mzoz是的,+Bergi非常感谢您,并祝您圣诞快乐!MDN有一篇文章叫做
          console.log(‘Sync code started…’);
    
          setTimeout(function asyncLog() {
               console.log(‘Async function has completed’)
          }, 2000);
    
          console.log(‘Sync code finished…')