为什么JavaScript不支持多线程?

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


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的未来,请查看:http://developer.mozilla.org/presentations/xtech2006/javascript/


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

    当然,现在我们有了。 但是,浏览器需要一点时间才能赶上 - 其中大部分都是围绕单线程模型设计的,而改变这一点并不容易。 Google Gears通过要求隔离后台执行 - 不改变DOM(因为这不是线程安全的),不访问由主线程创建的对象(同上),从而避免了很多潜在的问题。 尽管是限制性的,但这很可能是近期最实用的设计,因为它简化了浏览器的设计,并且降低了让经验不足的JS编码器陷入线程的风险。

    @marcio:

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

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


    JavaScript多线程(有一些限制)就在这里。 Google实施了Gears工作人员,并且工作人员正在使用HTML5。 大多数浏览器已经添加了对此功能的支持。

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

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

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

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

    链接地址: http://www.djcxy.com/p/56991.html

    上一篇: Why doesn't JavaScript support multithreading?

    下一篇: Disable browser 'Save Password' functionality