为什么JavaScript不支持multithreading?

这是一个故意的devise决定还是我们目前的浏览器的问题,将在未来版本中纠正?

JavaScript不支持multithreading,因为浏览器中的JavaScript解释器是单线程(AFAIK)。 即使Google Chrome也不会让单个网页的JavaScript同时运行,因为这会在现有的网页中造成大量的并发问题。 所有的Chrome都是将不同的组件(不同的标签,插件等等)分成独立的进程,但我无法想象一个页面有多个JavaScript线程。

但是,您可以像使用setTimeout使用某种sorting和“假”并发。 这会导致浏览器重新获得对呈现线程的控制权,并在指定的毫秒数后启动提供给setTimeout的JavaScript代码。 如果要在执行操作时允许刷新视口(看到的),这非常有用。 只要循环通过坐标和更新一个元素相应只会让你看到开始和结束的位置,而没有在两者之间。

我们在JavaScript中使用抽象库,允许我们创build进程和线程,这些进程和线程都由相同的JavaScript解释器pipe理。 这使我们能够以下列方式运行操作:

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

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

对于JavaScript的未来,请查看: http : //developer.mozilla.org/presentations/xtech2006/javascript/

传统上,JS是用于简短的,快速运行的代码段。 如果你进行了大量的计算,那么你是在服务器上做的 – 一个长时间在浏览器中运行的JS + HTML 应用程序的想法是荒谬的。

当然,现在我们有。 但是,浏览器需要一点时间才能赶上,其中大部分是围绕单线程模型devise的,而改变这一点并不容易。 Google Gears通过要求背景执行是孤立的 – 无需改变DOM(因为这不是线程安全的),也不访问由主线程(同上)创build的对象,从而避免了许多潜在的问题。 虽然是限制性的,但是这可能是不久的将来最实用的devise,因为它简化了浏览器的devise,并且降低了让经验不足的JS编码器陷入线程的风险。

@marcio :

为什么这是不在Javascript中实现multithreading的原因? 程序员可以用他们所拥有的工具来做任何他们想做的事情。

那么,让我们不要给他们那些容易被滥用的工具,以至于我打开的每个其他网站都会导致浏览器崩溃。 一个简单的实现会让你直接进入导致MS在IE7开发过程中如此头痛的领域:附加代码作者在线程模型中玩得很快而且松散,导致当主线程中的对象生命周期发生变化时,隐藏的错误变得明显。 坏。 如果你正在为IE编写multithreading的ActiveX附加组件,我想它是与领土一起来的; 并不意味着它需要走得更远。

JavaScriptmultithreading(有一些限制)在这里。 谷歌实施了Gears工作人员,工作人员正在被纳入HTML5。 大多数浏览器已经添加了对此function的支持。

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

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

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

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

我不知道这个决定的基本原理,但我知道你可以使用setTimeout来模拟multithreading编程的一些好处。 你可以给出多个进程在同一时间做事情的幻觉,但事实上,一切都发生在一个线程中。

只要你的function做了一点工作,然后打电话给:

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

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

Multithread.js封装了Web Workers,并允许在JS中轻松实现multithreading。 适用于所有新的浏览器,包括iOS Safari。 🙂

你的意思是为什么这个语言不支持multithreading,或者为什么浏览器中的JavaScript引擎不支持multithreading呢?

对于第一个问题的回答是,浏览器中的JavaScript应该是运行在沙盒中,并且是与机器/操作系统无关的方式,添加multithreading支持会使语言复杂化,并使语言与操作系统紧密相连。

就像马特b说的那样,问题不是很清楚。 假设你正在问语言中的multithreading支持:因为当前在浏览器中运行的应用程序中有99.999%不需要它。 如果你真的需要它,有一些解决方法(比如使用window.setTimeout)。

一般来说,multithreading是非常,非常,非常非常非常非常非常非常非常困难(我说这很难吗?),除非你有额外的限制(比如只使用不可变的数据)。

英特尔一直在开发Javascript的multithreading开源研究,最近在GDC 2012上进行了展示。下面是该video的链接。 研究小组使用OpenCL,主要关注英特尔芯片组和Windows操作系统。 该项目代号为RiverTrail,代码在GitHub上可用

一些更有用的链接:

为Web应用程序构build计算公路

目前一些浏览器确实支持multithreading。 所以,如果你需要,你可以使用特定的库。 例如,查看下一个资料:

据我所知谷歌浏览器将有multithreading的JavaScript,所以这是一个“目前的实施”的问题。

根据这篇文章 ,已经可以实现JavaScript线程。

这是不支持multithreading的实现。 目前,Google Gears正在提供一种通过执行外部stream程来使用某种forms的并发的方法,但这就是它。

谷歌今天应该发布的新浏览器(谷歌浏览器)将并行执行一些代码。

Java的核心语言当然可以得到相同的支持,但支持Erlang的并发等function远不及地平线。

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

但是,您可以使用eval函数将并发性带到某种程度

 /* content of the threads to be run */ var threads = [ [ "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');", "document.write('Foo <br/>');" ], [ "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');", "document.write('Bar <br/>');" ] ]; window.onload = function() { var lines = 0, quantum = 3, max = 0; /* get the longer thread length */ for(var i=0; i<threads.length; i++) { if(max < threads[i].length) { max = threads[i].length; } } /* execute them */ while(lines < max) { for(var i=0; i<threads.length; i++) { for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) { eval(threads[i][j]); } } lines += quantum; } } 

使用HTML5的networking工作者显然可以使用javascript进行multithreading。

webworkers和一个标准的multithreading环境之间的主要区别是内存资源不与主线程共享,对一个对象的引用在一个线程之间是不可见的。 线程通过交换消息进行通信,因此可以在事件驱动devise模式之后实现同步和并发方法调用algorithm。

存在许多允许在线程之间编程的框架,其中包括OODK-JS,支持并发编程的OOP js框架https://github.com/GOMServices/oodk-js-oop-for-js