为什么JavaScript不支持多线程?

2020/10/08 03:01 · javascript ·  · 0评论

是当今的浏览器是否经过深思熟虑的设计决策或存在问题,这些问题将在以后的版本中得到解决?

JavaScript不支持多线程,因为浏览器中的JavaScript解释器是单线程(AFAIK)。甚至谷歌浏览器也不允许单个网页的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的未来,请查看以下网址https :
//developer.mozilla.org/presentations/xtech2006/javascript/

JavaScript多线程(有一些限制)在这里。Google实施了Gears的worker,并且HTML5中包含了worker。大多数浏览器已经添加了对此功能的支持。

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

有关更多信息,请阅读:

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

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

传统上,JS旨在用于简短,快速运行的代码段。如果您要进行大量计算,那么您是在服务器上完成的-JS + HTML应用程序在您的浏览器中运行很长一段时间以完成不重要的事情的想法是荒谬的。

当然,现在我们有了。但是,浏览器要赶上一点时间-大多数浏览器都是围绕单线程模型设计的,要更改它并不容易。Google Gears通过要求隔离后台执行来避免很多潜在的问题-请勿更改DOM(因为它不是线程安全的),也不可以访问由主线程创建的对象(同上)。尽管有一定的局限性,但这可能是近期内最实用的设计,这既是因为它简化了浏览器的设计,又因为它降低了允许经验不足的JS编码器弄乱线程的风险...

@marcio

为什么不使用Java脚本实现多线程的原因呢?程序员可以使用自己拥有的工具做任何想做的事情。

因此,我们不要为他们提供易于滥用的工具,以至于我打开的每个其他网站都最终导致浏览器崩溃。天真的实现会使您直接进入导致IE7开发过程中MS头疼的领域:附加作者在线程模型中玩得很快而松懈,导致隐藏的错误在对象生命周期在主线程上更改时变得显而易见。 。坏。如果您正在为IE编写多线程ActiveX加载项,我想它就是其中的一部分。并不意味着它需要进一步发展。

我不知道此决定的理由,但我知道您可以使用setTimeout模拟多线程编程的一些好处。尽管实际上所有事情都在一个线程中发生,但您可以给人一种幻觉,即多个进程可以同时执行。

只是让您的函数做一些工作,然后调用类似的代码:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

只要有机会,其他任何需要做的事情(如UI更新,动画图像等)都会发生。

您是说该语言为什么不支持多线程,或者为什么浏览器中的JavaScript引擎不支持多线程?

第一个问题的答案是,浏览器中的JavaScript旨在在沙箱中以与计算机/操作系统无关的方式运行,添加多线程支持将使该语言变得复杂,并使该语言与操作系统之间的联系过于紧密。

Node.js 10.5+支持将工作线程作为实验性功能(可以在启用--experimental-worker标志的情况下使用它):https : //nodejs.org/api/worker_threads.html

因此,规则是:

  • 如果您需要执行I / O绑定操作,则可以使用内部机制(又名callback / promise / async-await)
  • 如果您需要执行CPU绑定的ops,请使用工作线程。

工作线程旨在用作长寿线程,这意味着您生成了一个后台线程,然后通过消息传递与其进行通信。

否则,如果您需要使用匿名函数执行沉重的CPU负载,则可以使用https://github.com/wilk/microjob,这是一个围绕工作线程构建的小型库。

正如马特b所说,问题不是很清楚。假设您正在询问使用以下语言的多线程支持:因为当前在浏览器中运行的99.999%的应用程序不需要多线程支持。如果您确实需要它,可以使用一些解决方法(例如使用window.setTimeout)。

通常,除非您施加了额外的限制(例如仅使用不可变数据),否则多线程很难,非常非常,非常非常(很难说?)。

英特尔一直在进行Java多线程的开源研究,该研究最近在GDC 2012上进行了展示。这是视频的链接该研究小组使用了OpenCL,它主要致力于Intel芯片组和Windows OS。该项目的代号为RiverTrail,代码可在GitHub上获得

一些更有用的链接:

为Web应用程序构建计算高速公路

当前,某些浏览器确实支持多线程。因此,如果需要,可以使用特定的库。例如,查看以下材料:

它是不支持多线程的实现。当前,Google Gears通过执行外部流程提供了一种使用某种形式的并发的方法,仅此而已。

Google应该在今天发布的新浏览器(Google Chrome)通过将进程分开来并行执行一些代码。

当然,核心语言可以提供与Java相同的支持,但是对诸如Erlang并发之类的支持还远远没有到来。

Javascript是一种单线程语言。这意味着它具有一个调用堆栈和一个内存堆。如预期的那样,它按顺序执行代码,并且必须先完成执行片段代码,然后才能继续执行下一个代码。它是同步的,但有时可能是有害的。例如,如果一个函数需要一段时间才能执行或必须等待某件事,那么它会同时冻结所有内容。

据我所知,谷歌浏览器将具有多线程javascript,因此这是一个“当前实现”问题。

如果没有适当的语言支持线程同步,那么尝试新的实现就没有意义。现有的复杂JS应用程序(例如使用ExtJS的任何应用程序)很可能会意外崩溃,但是如果没有synchronized关键字或类似内容,编写很难正确运行的新程序也将非常困难甚至无法实现。

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

使用HTML5带来的网络工作者显然可以使用javascript实现多线程。

Webworkers和标准多线程环境之间的主要区别是内存资源未与主线程共享,从一个线程到另一个线程看不到对对象的引用。线程通过交换消息进行通信,因此可以遵循事件驱动的设计模式来实现同步和并发方法调用算法。

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

本文地址:http://javascript.askforanswer.com/weishenmejavascriptbuzhichiduoxiancheng.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!