为什么JavaScript不支持多线程?

331

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


3
请参考JavaScript和线程问题的答案,了解有关Web Worker/Worker线程的信息。 - Sam Hasler
149
你好,Google的朋友。你可能会注意到这里的所有内容似乎都很陈旧(请注意此问题是五年前提出的)。自那时以来,Web浏览器已经具备了一些功能,据我所知,多线程功能已经得到了更多或更少的实现。请看Web Workers:http://msdn.microsoft.com/en-us/hh549259.aspx - ArtOfWarfare
3
Multithread.js 使用 Web Workers 封装了 JavaScript,可轻松实现多线程。适用于所有新浏览器,包括 iOS Safari。 :) - kwh
1
可能是JavaScript和线程的重复问题。 - Matt
一个服务工作者是一个脚本,你的浏览器在后台运行它,独立于网页之外,为不需要网页或用户交互的功能打开了大门。 - Omar bakhsh
16个回答

1

问题在于实现不支持多线程。目前,Google Gears提供了一种通过执行外部进程来使用某种形式的并发的方法,但仅限于此。

新的浏览器Google Chrome今天发布,通过将代码分离为进程并行执行。

当然,核心语言可以像Java一样具有相同的支持,但像Erlang并发这样的支持还远未出现在地平线上。


0

实际上,多线程与语言本身无关。 这里有一个针对.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}`);
");

此外,微软正在开发 Napa.js,这是一个支持多线程的 Node.js 克隆版。

https://github.com/microsoft/napajs


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

0
据我所了解,谷歌浏览器将会拥有多线程的 JavaScript 支持,因此这是一个“当前实现”的问题。

-3

使用HTML5带来的WebWorkers,可以清楚地实现JavaScript的多线程。

WebWorkers和标准的多线程环境的主要区别在于内存资源不与主线程共享,一个对象的引用对另一个线程不可见。线程通过交换消息进行通信,因此可以实现基于事件驱动设计模式的同步和并发方法调用算法。

许多框架允许在线程之间结构化编程,其中包括OODK-JS,这是一个支持并发编程的面向对象JavaScript框架 https://github.com/GOMServices/oodk-js-oop-for-js


6
线程与独立进程的区别在于共享内存,这就是线程的确切定义(例如fork()和exec()),线程可以共享对象,而进程必须使用进程间通信(IPC)。Web Workers不是多线程。 - felixfbecker

-4

然而,您可以使用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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接