【问题标题】:Do the JavaScript web APIs run on a different thread than the call stack thread?JavaScript Web API 是否在与调用堆栈线程不同的线程上运行?
【发布时间】:2018-05-11 00:26:24
【问题描述】:

在 Philip Roberts 的以下视频中的 12:16,他谈到了在与调用堆栈不同的线程上运行的 Web API 和 Node API,如果我理解他的话?那么,这是否正确,Web API 和 Node API 是否运行在与调用堆栈和事件循环不同的线程上?

如果为真,这是否意味着它们将与在调用堆栈中执行的 JavaScript 并行运行?

https://www.youtube.com/watch?v=8aGhZQkoFbQ

【问题讨论】:

  • 排序,但有效结果为NO。他说的是“运行时一次只能做一件事”。然后他重复了几次。 Web API 和 Node API(这是 V8 特定的)在不同的线程中运行;但是,当与运行时交互时,它们必须在运行时的单个线程内将自己注入到堆栈(或事件循环)中。这意味着,所有这些任务都有效地在运行时间受限的一个线程中运行。
  • 他确实声明“运行时一次只能做一件事”,但随后声明 Web API“实际上是您无法访问的线程,就像您可以调用的线程一样...”然后,清楚地显示 setTimeout 在 Web API 中发生,完成后,Web API 将结果推送到事件循环中,然后将其推送到调用堆栈中。我已经多次观看这个视频,我的解释是当setTimeout 被调用时,它在 Web API 中执行,然后将结果推送到事件循环中,与 API 请求没有什么不同......
  • 是的,您的解释是正确的。浏览器以多线程方式优化性能,但您的 JS 应用程序仍然受到限制。所以有效的整体结果还是受限于阻力最大的路径——JS运行时的单线程。除非你使用 WebWorkers :-)
  • 我想我明白你在说什么,你是说即使 Web API 或 Node API 在不同的线程上并行执行一些工作,JS 应用程序仍然受事实上,当调用堆栈完成当前在其中的工作时,该工作的结果最终在事件循环中结束,然后将结果推送到调用堆栈中?在调用堆栈为空之前,什么都不会发生。
  • 是的....没错!

标签: javascript


【解决方案1】:

简短回答:是的。

正如 cmets 中所指出的,Web API “实际上是线程”,尽管具有不同的行为和目的。

最后,当任何回调被推入调用堆栈时,结果仍将被 JavaScript 运行时的单一“线程”访问和限制。

【讨论】:

  • 你的意思是 setimeout 和 setiinterval 也在不同的线程上运行?而且每个线程都有不同的调用堆栈,因为线程有自己的堆栈,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多