是当今的浏览器是否经过深思熟虑的设计决策或存在问题,这些问题将在以后的版本中得到解决?
是当今的浏览器是否经过深思熟虑的设计决策或存在问题,这些问题将在以后的版本中得到解决?
Answers:
JavaScript不支持多线程,因为浏览器中的JavaScript解释器是单线程(AFAIK)。甚至谷歌浏览器也不允许单个网页的JavaScript同时运行,因为这会在现有网页中引起大量的并发问题。Chrome所做的全部工作就是将多个组件(不同的选项卡,插件等)分离到单独的进程中,但是我无法想象一个页面具有多个JavaScript线程。
但是,您可以按照建议使用setTimeout
来进行某种调度和“伪”并发。这将导致浏览器重新获得对呈现线程的控制,并setTimeout
在给定的毫秒数后启动提供的JavaScript代码。如果要在对视口执行操作时允许其刷新(视口),这将非常有用。仅仅循环遍历例如坐标并相应地更新元素就可以让您看到开始位置和结束位置,而中间没有任何内容。
我们在JavaScript中使用了一个抽象库,该抽象库允许我们创建由同一JavaScript解释器管理的进程和线程。这使我们可以通过以下方式运行操作:
这允许某种形式的调度和伪造的并行性,线程的启动和停止等,但它不是真正的多线程。我认为它永远不会以语言本身实现,因为真正的多线程仅在浏览器可以运行单页多线程(甚至多个内核)的情况下才有用,而且困难更大。比额外的可能性。
对于JavaScript的未来,请查看以下网址:https : //developer.mozilla.org/presentations/xtech2006/javascript/
JavaScript多线程(有一些限制)在这里。Google实施了Gears的worker,并且HTML5中包含了worker。大多数浏览器已经添加了对此功能的支持。
保证数据的线程安全性,因为与工作人员通信的所有数据均已序列化/复制。
有关更多信息,请阅读:
传统上,JS旨在用于简短,快速运行的代码段。如果您要进行大量计算,那么您是在服务器上完成的-一个JS + HTML 应用程序可以长时间运行在浏览器中做不重要的事情的想法是荒谬的。
当然,现在我们有了。但是,浏览器要赶上一点时间-大多数浏览器都是围绕单线程模型设计的,要更改它并不容易。Google Gears通过要求隔离后台执行来避免很多潜在的问题-请勿更改DOM(因为它不是线程安全的),也不能访问由主线程创建的对象(同上)。尽管有一定的局限性,但这可能是近期内最实用的设计,这既是因为它简化了浏览器的设计,又因为它降低了让经验不足的JS编码器弄乱线程所涉及的风险...
为什么不使用Java脚本实现多线程的原因呢?程序员可以使用自己拥有的工具做任何想做的事情。
因此,我们不要为他们提供易于滥用的工具,以至于我打开的每个其他网站都最终导致浏览器崩溃。天真的实现会使您直接进入导致IE7开发过程中MS头疼的领域:附加作者在线程模型中玩得很快而又松懈,导致隐藏的错误在对象生命周期在主线程上更改时变得很明显。坏。如果您正在为IE编写多线程ActiveX加载项,我想它就是其中的一部分。并不意味着它需要进一步发展。
我不知道此决定的理由,但我知道您可以使用setTimeout模拟多线程编程的一些好处。尽管实际上所有事情都在一个线程中发生,但是您可以给出多个进程同时执行的幻觉。
只是让您的函数做一些工作,然后调用类似的代码:
setTimeout(function () {
... do the rest of the work...
}, 0);
只要有机会,其他需要做的事情(例如UI更新,动画图像等)就会发生。
loop
内部使用,setTimeout
但显然不起作用。你有没有做过这样的事情,或者你有黑客?一个示例是1000个元素的数组,我希望在两个setTimeout
调用中使用两个for循环,这样第一个循环通过and print元素0..499
,第二个循环通过and print元素500..999
。
Node.js 10.5+支持将工作线程作为实验功能(您可以在启用--experimental-worker标志的情况下使用它):https : //nodejs.org/api/worker_threads.html
因此,规则是:
工作线程旨在用作长寿线程,这意味着您会生成一个后台线程,然后通过消息传递与其进行通信。
否则,如果您需要使用匿名函数执行沉重的CPU负载,则可以使用https://github.com/wilk/microjob,这是一个围绕工作线程构建的小型库。
英特尔一直在进行一些有关Java多线程的开源研究,该研究最近在GDC 2012上进行了演示。这是该视频的链接。该研究小组使用了OpenCL,它主要致力于英特尔芯片组和Windows操作系统。该项目的代号为RiverTrail,代码可在GitHub上获得
一些更有用的链接:
当前,某些浏览器确实支持多线程。因此,如果需要,可以使用特定的库。例如,查看以下材料:
它是不支持多线程的实现。目前,Google Gears通过执行外部流程提供了一种使用某种形式的并发的方法,仅此而已。
Google应该在今天发布的新浏览器(Google Chrome)通过将进程分开来并行执行一些代码。
当然,核心语言可以提供与Java相同的支持,但是对诸如Erlang并发之类的支持还远远没有到来。
Javascript是一种单线程语言。这意味着它具有一个调用堆栈和一个内存堆。正如预期的那样,它按顺序执行代码,并且必须先完成执行片段代码,然后才能继续执行下一个代码。它是同步的,但有时可能是有害的。例如,如果一个函数需要一段时间才能执行或必须等待某件事,那么它会同时冻结所有内容。
但是,您可以使用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