为什么 JavaScript 不支持多线程?

2022-08-29 23:55:04

这是一个深思熟虑的设计决定还是我们当前浏览器的问题,将在即将推出的版本中得到纠正?


答案 1

JavaScript 不支持多线程,因为浏览器中的 JavaScript 解释器是单线程 (AFAIK)。即使是Google Chrome也不会允许单个网页的JavaScript同时运行,因为这会导致现有网页出现大量并发问题。Chrome所做的就是将多个组件(不同的选项卡,插件等)分离到单独的进程中,但我无法想象单个页面具有多个JavaScript线程。

但是,您可以按照建议使用,以允许某种计划和“假”并发。这会导致浏览器重新获得对呈现线程的控制,并在给定的毫秒数后启动提供给 的 JavaScript 代码。如果要允许视区(您看到的内容)在执行操作时刷新,这将非常有用。只需循环通过例如坐标并相应地更新元素,就可以让您看到开始和结束位置,而两者之间没有任何位置。setTimeoutsetTimeout

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

  • 进程 A,线程 1
  • 进程 A,线程 2
  • 进程 B,线程 1
  • 进程 A,线程 3
  • 进程 A,线程 4
  • 进程 B,线程 2
  • 暂停进程 A
  • 进程 B,线程 3
  • 进程 B,线程 4
  • 进程 B,线程 5
  • 启动进程 A
  • 进程 A,线程 5

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

对于JavaScript的未来,请查看以下内容:https://developer.mozilla.org/presentations/xtech2006/javascript/


答案 2

JavaScript多线程(有一些限制)在这里。Google为Gears实现了workers,并且worker被包含在HTML5中。大多数浏览器已经添加了对此功能的支持。

数据的线程安全性得到保证,因为与工作线程通信/从工作线程传递的所有数据都是序列化/复制的。

有关详细信息,请阅读:

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/