首页 / 知识
为什么JavaScript不支持多线程?
2023-04-13 23:02:00

Why doesn't JavaScript support multithreading?这是一个刻意的设计决定还是我们当前浏览器的问题,将在未来版本中得到纠正? JavaScript不支持多线程,因为浏览器中的JavaScript解释器是单线程(AFAIK)。即使谷歌Chrome也不会让单个网页的JavaScript同时运行,因为这会在现有网页中造成大量并发问题。所有Chrome确实将单独的多个组件(不同的选项卡,插件等)分离到单独的进程中,但我无法想象单个页面具有多个JavaScript线程。
但是,您可以使用 我们在JavaScript中使用抽象库,允许我们创建由同一JavaScript解释器管理的进程和线程。这允许我们以下列方式运行操作:
这允许某种形式的调度和伪造并行,线程的启动和停止等,但它不是真正的多线程。我认为它不会在语言本身中实现,因为真正的多线程只有在浏览器可以运行单个页面多线程(甚至多个核心)时才有用,并且存在更大的困难比额外的可能性。
对于JavaScript的未来,请查看: 传统上,JS旨在用于简短,快速运行的代码片段。如果您正在进行重大计算,那么您是在服务器上进行的 - 在浏览器中长时间运行的JS + HTML应用程序的想法是非常荒谬的。 当然,现在我们有了。但是,浏览器需要花费一些时间才能赶上 - 大多数都是围绕单线程模型设计的,改变这一点并不容易。 Google Gears通过要求后台执行被隔离来解决许多潜在问题 - 不更改DOM(因为这不是线程安全的),不访问主线程创建的对象(同上)。虽然限制性,但这可能是不久的将来最实用的设计,因为它简化了浏览器的设计,并且因为它降低了允许没有经验的JS编码人员乱用线程所涉及的风险...... @marcio:
那么,我们不要给他们那些容易被滥用的工具,以至于我打开的每个其他网站都会崩溃我的浏览器。这种天真的实现会让你直接进入导致MS在IE7开发过程中出现如此多头痛的领域:附加作者使用线程模型快速而松散地运行,导致隐藏的错误在主线程上对象生命周期发生变化时变得明显。坏。如果您正在为IE编写多线程ActiveX加载项,我想它是随着领域而来的;并不意味着它需要更进一步。 JavaScript多线程(有一些限制)就在这里。谷歌为Gears实施了工作人员,HTML5中包含了工作人员。大多数浏览器已经添加了对此功能的支持。 数据的线程安全性得到保证,因为与工作者之间传递的所有数据都是序列化/复制的。 有关详细信息,请阅读: http://www.whatwg.org/specs/web-workers/current-work/ http://ejohn.org/blog/web-workers/ 我不知道这个决定的基本原理,但我知道您可以使用setTimeout模拟多线程编程的一些好处。您可以同时给出多个进程处理事务的错觉,但实际上,所有事情都发生在一个线程中。 让你的函数做一些工作,然后调用类似的东西:
当他们有机会时,任何其他需要做的事情(如UI更新,动画图像等)都会发生。 你的意思是为什么语言不支持多线程或为什么浏览器中的JavaScript引擎不支持多线程? 第一个问题的答案是浏览器中的JavaScript意味着在沙箱中运行,并且以机器/ OS独立的方式运行,添加多线程支持会使语言复杂化并使语言与操作系统过于紧密地联系起来。 正如亚光b所说,问题不是很清楚。假设您询问该语言中的多线程支持:因为目前在浏览器中运行的应用程序不需要99.999%。如果你真的需要它,有一些解决方法(比如使用window.setTimeout)。 一般来说,多线程是非常,非常,非常,非常非常难(我说它很难吗?)要正确,除非你加入额外的限制(比如只使用不可变数据)。 Node.js 10.5+支持工作线程作为实验性功能(您可以在启用--experimental-worker标志的情况下使用它):https://nodejs.org/api/worker_threads.html 所以,规则是:
工作线程旨在成为长生命线程,这意味着您生成后台线程,然后通过消息传递与它进行通信。 否则,如果您需要使用匿名函数执行繁重的CPU负载,那么您可以使用https://github.com/wilk/microjob,这是一个围绕工作线程构建的小型库。
英特尔一直在Javascript中对多线程进行一些开源研究,最近在GDC 2012上展示了它。 一些更有用的链接: 构建Web应用程序的计算高速公路 目前一些浏览器确实支持多线程。因此,如果您需要,可以使用特定的库。例如,查看下一个材料:
这是不支持多线程的实现。目前,Google Gears提供了一种通过执行外部流程来使用某种形式的并发性的方法,但这就是它。 谷歌应该今天发布的新浏览器(谷歌浏览器)通过在进程中分离它来并行执行一些代码。 核心语言当然可以提供与Java相同的支持,但是对Erlang的并发性的支持远未实现。
如果没有适当的语言支持来进行线程同步,那么尝试新的实现就没有意义。现有的复杂JS应用程序(例如使用ExtJS的任何东西)很可能会意外崩溃,但如果没有 据我所知,谷歌Chrome将拥有多线程的javascript,因此它是一个"当前实现"的问题。 但是,您可以使用eval函数将并发性带到某种程度
使用HTML5带来的webworkers显然可以使用javascript进行多线程处理。 Web工作者和标准多线程环境之间的主要区别是内存资源不与主线程共享,对象的引用从一个线程到另一个线程是不可见的。线程通过交换消息进行通信,因此可以在事件驱动的设计模式之后实现同步和并发方法调用算法。
存在许多允许在线程之间构建编程的框架,其中包括OODK-JS,一个支持并发编程的OOP js框架 |
最新内容
相关内容
linux浏览网页的命令?
linux浏览网页的命令?,工作,系统,传播,地址,命令,环境,发行,信息,网络,基础,linux在命令符界面如何浏览网页首先,连接相应linux主机,进入到linuxlinux查看多线程命令?
linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,如何查看linux服务器的cpu数量,内核数,和cpu线程数如何查看linuxlinux启动浏览器命令?
linux启动浏览器命令?,系统,情况,发行,不了,官网,环境,工具,传播,基础,软件,如何使用linux命令打开网页在命令符界面浏览网页可以使用lynx,linklinux默认浏览器命令?
linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管理系统,如何在Linux环境下,使用Java打开默认浏览器退出firefox。删linux命令下载浏览器?
linux命令下载浏览器?,软件,系统,官网,网站,工具,名称,中心,密码,时间,设计,linux怎样安装google浏览器?1、打开linux虚拟机,启动火狐浏览器,在linux命令关浏览器?
linux命令关浏览器?,系统,工作,工具,咨询,信息,平台,官方网站,管理,数据,电脑,linux系统中如何关掉火狐浏览器的缓存,不想使用火狐浏览器的缓linux下载命令多线程?
linux下载命令多线程?,系统,单位,概念,数据,线程,进程,产品,地址,代码,状态,谁有linux下多线程库的源码啊,要确实可用的,确实可以免费下载的,linux命令行浏览页面?
linux命令行浏览页面?,系统,工具,首页,信息,密码,终端,命令,网址,数据,传播,linux怎么用命令打开命令窗口1、在Linux系统中,打开命令行窗口需要linux多线程跑命令?
linux多线程跑命令?,系统,代码,单位,地址,工具,入口,信息,管理,位置,服务,Linux多线程之同步互斥锁和读写锁:提供对临界资源的保护,当多线程试图linux命令符浏览网页?
linux命令符浏览网页?,系统,网络,工具,环境,首页,终端,网站,软件,密码,地址,linux怎么打开命令行窗口在Linux系统中,打开命令行窗口需要使用终什么是Python全局解释器锁(GIL)?
什么是Python全局解释器锁(GIL)?,数据,控制权,状态,持有,工具,时间,设计,培训,全局,线程,全局解释器锁是计算机程序设计语言解释器用于同步线Python解释器种类以及特点有哪些?
Python解释器种类以及特点有哪些?,代码,技术,培训,特点,字节,种类,速度,语言,方式,文件,当我们编写完Python代码时,我们会得到一个包含Python代