繁体   English   中英

事件循环,回调队列和Javascript的单线程如何连接?

[英]How are the Event Loop, Callback Queue, and Javascript’s single thread connected?

一般目标

我想知道以下javascript环境如何作为系统互连

  • Javascript引擎
  • 事件循环
  • 事件队列

我们可以将其限制在浏览器环境中,因为节点已在另一篇文章中介绍( 此处

我(相信)了解的事情:

  • Javascript是单线程的,因此只有一个调用栈。

  • Javascript环境仅提供了一些真正异步的功能。 这些可能包括setTimeout(),setInterval()和I / O函数。

  • 如果不使用其中之一,开发人员就无法创建自己的异步功能。
  • Javascript本身是同步运行的,但是一旦清除了当前的调用栈,异步函数就可以回调可能阻塞的函数。

例:

      console.log(‘Sync code started…’);

      setTimeout(function asyncLog() {
           console.log(‘Async function has completed’)
      }, 2000);

      console.log(‘Sync code finished…')

示例步骤:

(如果我错了,请更正步骤)

  1. 记录“同步代码已开始...”
  2. setTimeout被添加到堆栈,但立即返回控制
  3. setTimeout被发送到另一个“线程” ...“工人”吗? 在javascript的单线程之外计算2000毫秒
  4. 记录“同步代码完成...”
  5. 2000毫秒后,asyncLog()被推送到事件队列
  6. 因为清除了调用堆栈,所以事件循环检查事件队列中是否有未决的回调
  7. asyncLog()从队列中删除,并通过事件循环推入堆栈
  8. 记录“异步功能已完成”
  9. 调用栈现在很清楚

问题

如果有人可以概述异步函数(例如setTimeout)从第一次访问调用栈到被调用回调用栈的方式和位置的步骤,则不需要一一回答。

  1. 在第3步中,谁产生了这个新线程? 是浏览器吗?
    • 这个新线程被阻止了吗?
    • 如果您有一个循环创建1000 setTimeouts,会发生什么情况。 是否创建了1000个“线程”?
    • 一次可以产生多少个线程是否有限制?
    • 当新线程完成执行时,它如何在队列中结束?
  2. 谁提供事件队列?
  3. 谁提供事件循环?
    • 事件循环是否轮询事件队列?
    • JavaScript的线程知道事件循环吗? 还是事件循环只是将事物压入堆栈?
    • 事件循环如何知道何时清除堆栈?

您的理解和榜样似乎基本上是正确的。 现在,对您的问题:

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

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

这个新线程被阻止了吗?

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

如果您有一个循环创建1000 setTimeouts,会发生什么情况。 是否创建了1000个“线程”?

可能。 不过不太可能。 我假设对于那些确实需要自己的线程的异步操作,使用了线程池,并对请求进行了排队。 该池的大小可能隐藏在浏览器配置的肠子中。

一次可以产生多少个线程是否有限制?

那将由操作系统控制。

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

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

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

我想说的是实现细节,无论循环轮询队列还是队列驱动循环迭代。

JavaScript的线程知道事件循环吗? 还是事件循环只是将事物压入堆栈?

我会说JavaScript 事件循环线程中运行。 事件循环只是反复从队列中弹出事件并执行其javascript。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM