这是故意设计的决定还是我们当前的浏览器存在问题,将在未来版本中纠正?
这是故意设计的决定还是我们当前的浏览器存在问题,将在未来版本中纠正?
问题在于实现不支持多线程。目前,Google Gears提供了一种通过执行外部进程来使用某种形式的并发的方法,但仅限于此。
新的浏览器Google Chrome今天发布,通过将代码分离为进程并行执行。
当然,核心语言可以像Java一样具有相同的支持,但像Erlang并发这样的支持还远未出现在地平线上。
实际上,多线程与语言本身无关。 这里有一个针对.NET的多线程JavaScript引擎。 它在多线程场景下运行得非常好。 它与C#运行时集成,因此所有同步逻辑类似于C#。您可以启动/等待/等待任务,并启动线程。您甚至可以放置锁定。以下示例演示了在.NET运行时中使用JavaScript语法的并行循环。
https://github.com/koculu/topaz
var engine = new TopazEngine();
engine.AddType(typeof(Console), "Console");
topazEngine.AddType(typeof(Parallel), "Parallel");
engine.ExecuteScript(@"
var sharedVariable = 0
function f1(i) {
sharedVariable = i
}
Parallel.For(0, 100000 , f1)
Console.WriteLine(`Final value: {sharedVariable}`);
");
使用HTML5带来的WebWorkers,可以清楚地实现JavaScript的多线程。
WebWorkers和标准的多线程环境的主要区别在于内存资源不与主线程共享,一个对象的引用对另一个线程不可见。线程通过交换消息进行通信,因此可以实现基于事件驱动设计模式的同步和并发方法调用算法。
许多框架允许在线程之间结构化编程,其中包括OODK-JS,这是一个支持并发编程的面向对象JavaScript框架 https://github.com/GOMServices/oodk-js-oop-for-js
然而,您可以使用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;
}
}