一尘不染

为什么JavaScript不支持多线程?

javascript

是当今的浏览器是否经过深思熟虑的设计决策或存在问题,这些问题将在以后的版本中得到解决?


阅读 651

收藏
2020-05-01

共1个答案

一尘不染

JavaScript不支持多线程,因为浏览器中的JavaScript解释器是单线程(AFAIK)。甚至谷歌浏览器也不允许单个网页的JavaScript同时运行,因为这会在现有网页中引起大量的并发问题。Chrome所做的全部工作就是将多个组件(不同的选项卡,插件等)分离到单独的进程中,但是我无法想象一个页面具有多个JavaScript线程。

但是,您可以按照建议使用setTimeout来进行某种调度和“伪”并发。这将导致浏览器重新获得对呈现线程的控制,并setTimeout在给定的毫秒数后启动提供的JavaScript代码。如果要在执行视口时刷新视口(看到的内容),这将非常有用。只需循环浏览例如坐标并相应地更新元素,就可以看到开始和结束位置,而中间没有任何内容。

我们在JavaScript中使用了一个抽象库,该库允许我们创建由相同的JavaScript解释器管理的进程和线程。这使我们可以通过以下方式运行操作:

  • 进程A,线程1
  • 进程A,线程2
  • 进程B,线程1
  • 进程A,线程3
  • 进程A,线程4
  • 进程B,线程2
  • 暂停程序A
  • 进程B,线程3
  • 进程B,线程4
  • 进程B,线程5
  • 开始过程A
  • 进程A,线程5

这允许某种形式的调度和伪造的并行性,线程的启动和停止等,但它不是真正的多线程。我认为它永远不会以语言本身实现,因为真正的多线程仅在浏览器可以运行单页多线程(甚至多个内核)时才有用,而且困难更大。比额外的可能性。

2020-05-01