JavaScript和线程
有没有办法在JavaScript中进行多线程处理?
解决方案
回答
在原始Javascript中,我们可以做的最好的事情就是使用几个异步调用(xmlhttprequest),但这并不是真正的线程化,而且非常有限。 Google Gears向浏览器添加了许多API,其中一些可用于线程支持。
回答
JavaScript中没有真正的线程。 JavaScript是它的可扩展语言,它确实允许我们模仿其中的一些。这是我前几天遇到的一个例子。
回答
有关最新的支持信息,请参见http://caniuse.com/#search=worker。
以下是大约2009年的支持情况。
我们要搜索的单词是JavaScript Worker线程
除了Gears之外,目前没有任何可用的东西,但是关于如何实现这一点的讨论很多,所以我猜想看这个问题,因为答案无疑会在未来改变。
以下是Gears的相关文档:WorkerPool API
WHATWG有一个针对工作线程的建议草案:Web Workers
还有Mozillas DOM Worker Threads
更新:2009年6月,浏览器对JavaScript线程支持的当前状态
Firefox 3.5具有网络工作者。如果需要查看网络工作者的一些演示,请执行以下操作:
- 模拟退火("尝试"链接)
- 太空侵略者(帖子末尾的链接)
- MoonBat JavaScript基准测试(第一个链接)
Gears插件也可以安装在Firefox中。
Safari 4和WebKit每晚都有工作线程:
- JavaScript Ray跟踪器
Chrome已加入Gears,因此可以执行线程操作,尽管它需要用户确认提示(并且Web工作者使用了不同的API,尽管它可以在安装了Gears插件的任何浏览器中使用):
- Google Gears WorkerPool演示(不是一个很好的例子,因为它运行速度太快,无法在Chrome和Firefox中进行测试,尽管IE的运行速度足够慢,以至于它阻止了交互)
IE8和IE9只能在安装Gears插件的情况下执行线程
回答
Javascript中没有真正的多线程,但是我们可以使用setTimeout()
和异步AJAX请求来获得异步行为。
我们到底想完成什么?
回答
我们可以使用Narrative JavaScript,这是一种将代码转换为状态机的编译器,可以有效地模拟线程。通过在允许我们在单个线性代码块中编写异步代码的语言中添加"屈服"运算符(表示为"->")来实现此目的。
回答
今天应该发布的新v8引擎支持它(我认为)