为什么JavaScript不支持多线程?

时间:2020-03-05 18:46:33  来源:igfitidea点击:

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

解决方案

回答

据我所知,谷歌浏览器将具有多线程javascript,因此这是一个"当前实现"问题。

回答

根据本文的介绍,已经可以实现JavaScript线程。

回答

我们是说语言为什么不支持多线程,或者为什么浏览器中的JavaScript引擎不支持多线程?

第一个问题的答案是,浏览器中的JavaScript旨在在沙箱中以与计算机/操作系统无关的方式运行,添加多线程支持将使该语言变得复杂,并使该语言与操作系统之间的联系过于紧密。

回答

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

Google应该在今天发布的新浏览器(Google Chrome)通过将进程分开来并行执行一些代码。

当然,核心语言可以提供与Java相同的支持,但是对诸如Erlang的并发之类的支持却遥遥无期。

回答

我不知道此决定的理由,但我知道我们可以使用setTimeout模拟多线程编程的一些好处。尽管实际上所有事情都在一个线程中发生,但我们可以给人一种幻觉,即多个进程可以同时执行任务。

只是让函数做一些工作,然后调用类似的命令:

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

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

回答

传统上,JS旨在用于简短,快速运行的代码段。如果要进行大量计算,那么我们是在服务器上完成的,那就是在浏览器中长时间运行JS + HTML应用程序的想法是荒谬的。

当然,现在我们有了。但是,浏览器要赶上大多数浏览器是围绕单线程模型设计的,这需要一点时间,并且更改它并不容易。 Google Gears通过要求隔离后台执行,不更改DOM(因为它不是线程安全的),避免访问由主线程创建的对象(同上)来避免很多潜在的问题。尽管有一定的局限性,但这可能是近期内最实用的设计,这既是因为它简化了浏览器的设计,又因为它降低了让经验不足的JS编码器弄乱线程所涉及的风险...

@marcio:

Why is that a reason not to implement multi-threading in Javascript? Programmers can do whatever they want with the tools they have.

因此,我们不要为他们提供易于滥用的工具,以至于我打开的每个其他网站都最终导致浏览器崩溃。天真的实现会使我们直接进入导致IE7开发过程中MS头疼的领域:添加作者在线程模型中玩得很快而松懈,导致隐藏的错误在对象生命周期在主线程上更改时变得显而易见。 。坏的。如果我们正在为IE编写多线程ActiveX加载项,我想它就是其中的一部分。并不意味着它需要进一步发展。

回答

正如马特b所说,问题不是很清楚。假设我们正在询问有关该语言的多线程支持:因为当前在浏览器中运行的99.999%的应用程序不需要多线程支持。如果我们确实需要它,可以使用一些解决方法(例如使用window.setTimeout)。

通常,除非我们施加了额外的限制(例如仅使用不可变数据),否则多线程很难,非常非常,非常非常(很难说?)。

回答

JavaScript不支持多线程,因为浏览器中的JavaScript解释器是单线程(AFAIK)。即使是Google Chrome,也不会让单个网页的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

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

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

回答

如果没有适当的语言支持线程同步,那么尝试新的实现就没有意义。现有的复杂JS应用程序(例如使用ExtJS的任何应用程序)很可能会意外崩溃,但是如果没有" synchronized"关键字或者类似的东西,编写出行为正确的新程序也将非常困难甚至无法实现。

回答

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

保证数据的线程安全性,因为与工作人员通信的所有数据都已序列化/已复制。

有关更多信息,请阅读:

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

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