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


当前回答

英特尔一直在做一些Javascript多线程的开源研究,最近在GDC 2012上展示了它。 这里是视频链接。研究小组使用的OpenCL主要集中在英特尔芯片组和Windows操作系统。该项目代号为RiverTrail,代码可在GitHub上获得

一些更有用的链接:

为Web应用程序构建计算高速公路

其他回答

正如matt b所说,这个问题不是很清楚。假设您正在询问语言中的多线程支持:因为目前在浏览器中运行的99.999%的应用程序都不需要多线程。如果你真的需要它,有一些变通方法(比如使用window.setTimeout)。

一般来说,多线程是非常,非常,非常,非常,非常,非常,很难(我说过它很难吗?),除非你加入额外的限制(比如只使用不可变数据)。

它的实现不支持多线程。目前谷歌Gears提供了一种通过执行外部进程来使用某种形式的并发的方法,但仅此而已。

新的浏览器谷歌应该今天发布(谷歌Chrome)通过在进程中分离一些代码并行执行。

当然,核心语言可以提供与Java相同的支持,但对Erlang并发性之类的支持还远远不够。

Node.js 10.5+支持工作线程作为实验特性(你可以使用——experimental-worker flag enabled): https://nodejs.org/api/worker_threads.html

所以,规则是:

如果你需要做I/O绑定操作,那么使用内部机制(即callback/promise/async-await) 如果你需要做CPU绑定的操作,那么使用工作线程。

工作线程是长期存在的线程,这意味着生成一个后台线程,然后通过消息传递与它通信。

否则,如果需要使用匿名函数执行较重的CPU负载,则可以使用https://github.com/wilk/microjob,这是一个围绕工作线程构建的小型库。

我不知道这个决定的基本原理,但我知道可以使用setTimeout模拟多线程编程的一些好处。您可以给人一种错觉,认为多个进程同时在做事情,但实际上,所有事情都发生在一个线程中。

只需要让你的函数做一点工作,然后调用类似这样的东西:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

任何其他需要做的事情(如UI更新,动画图像等)都会在他们有机会的时候发生。

JavaScript多线程(有一些限制)在这里。谷歌实现了Gears的worker, HTML5也包含了worker。大多数浏览器已经添加了对该特性的支持。

数据的线程安全得到了保证,因为所有与worker通信的数据都被序列化/复制。

欲了解更多信息,请阅读:

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

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