JavaScript多线程


10

如今,JavaScript是所有Web开发技术中的主要角色,在客户端方面,用于改善用户界面的功能,客户端逻辑,在某些Web服务器上,以及服务器端逻辑

此外,人们(至少其中一些人)开始将网络游戏开发从Flash转移到javascript和HTML5

是不是该支持多线程了!是否有允许JavaScript多线程的浏览器,或者是否存在任何标准版本,HTML5或更高版本?


1
人们不会做不必要的事情。为Javascript设计做出过贡献的人,也是与正在开发的网络服务器和浏览器相关的人,因此他们对此有所了解。这全都与实用程序有关。
Dipan Mehta 2012年

Answers:


9

多线程不会在EcmaScript中完成,但可以在主机环境中公开。

经典示例是WebWorkers,它允许您派遣后台工作人员进行工作并滥用,<iframe>以产生新流程。

应当指出,不需要JavaScript中的多线程(有例外,主要是图形相关的程序)。您不需要多个线程,GUI中已经有了一个事件循环,并且图形渲染(画布)是硬件加速的(这意味着GPU会为您并行并行渲染图形)。

尽管像webcl这样的项目非常令人兴奋。


2
您可以扩展“不需要”这一事实吗?最近我遇到了一个实例,在桌面编程中,自然的情况是生成一个线程来处理任务,但这显然不是一个简单或标准的选择。我解决了这种情况,但生成线程似乎是更优雅的解决方案。
钻机2012年

@rig您要处理的情况是什么?
Zachary K'3

@Rig给出一个具体的例子。计算昂贵的处理在客户端JavaScript中很少见
Raynos'3

@Raynos请做更多关于不需要它的解释,我只是认为不确定例如在游戏开发中如果图形和物理方面的计算量很大,并且如果没有多线程,逻辑帧率将很容易受到影响。
阿里

我对@Ali进行了调查,并说有例外。但是,大部分繁重的计算应通过硬件加速图形API给予GPU
Raynos

4

没有

多线程是软件中最难解决的问题之一。当您的代码不确定时,有太多很难解决的极端情况。(我说的是带锁的多线程等)。另外,所有各种JavaScript库都是基于非多线程的假设构建的。

话虽这么说,但有些Web工作人员确实为您提供了一个基于actor的框架,用于进行多种处理类型的操作。您可以创建工作程序并通过事件来回传递数据。

编辑: 另一个原因是,当创建JavaScript时,它是假设它可以用于小任务,因此没有并发内置。要进行改进,现在将破坏很多代码。通过添加Web Worker,可以有一个没有任何共享内存的并发系统,但是通过使用actor,并发模型在许多其他语言(如Erlang,Scala,Clojure)中表现出了非常强大的性能。等等

(如果您不能告诉我我真的不喜欢基于锁的并发)


1
Multi threading is one of the hardest things in software to get right.-我对此感到惊讶!您使用的浏览器,台式机的操作系统,服务于此页面的Web服务器-实际上,您每天使用的每个应用程序都是多线程的。您确定要这么做吗?尚未打动您,但我会告诉您multithreading is not done because it is hard
Dipan Mehta 2012年

3
@DipanMehta多线程软件中最难解决的问题之一。所有这些应用程序之所以使用它,是因为它们是由真正有才华的人
Raynos

@Raynos-天哪!所以你叫我才华横溢!我每天都在使用它...我想当您使用C编程或任何大型应用程序时,它非常普遍。关键是,不管用法和要求如何,W3C联盟并没有真正为Javascript保留它,因为它太难了
Dipan Mehta 2012年

2
您严重低估了编写正确和有效的并行程序的难度。但是JavaScript中并没有使用多线程,因为它不必要的复杂性(事情是在3周内完成的)
Raynos

2
@DipanMehta正确完成了基于锁的并发,并且钉住所有极端情况是一个难题。例如,直到几年前,实现具有锁的队列之类的简单操作(在所有情况下都可以证明是正确的)才是可发布的结果。但是更重要的是,试图将其改编成没有语言的语言却带来了麻烦。
Zachary K'3

3

打开javascript进行多线程处理将产生比解决的问题更多的问题:

当前的体系结构是基于事件的单线程(通常在gui线程中运行),换句话说,每一个代码块都可以确保环境中的一切从头到尾都不会改变,除非有所改变在代码中。

一旦您允许抢占或并行执行,此功能便消失了,这意味着您需要对要变异的数据应用锁,并且需要对整个竞争条件进行调试,以免产生麻烦

可以使用超时进行伪并行执行,这意味着将大型或长期运行的函数拆分为原子块并使用,setTimeout(function(){nextstep(args);},1);以便在需要时可以运行其他内容


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.