Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

一个页面就能卡死整只Firefox进程

  在Firefox中只要一个标签页卡住,所有的标签页都会停止工作,甚至整个进程都会停止响应。这很有可能是因为Firefox运行在单进程所带来的问题,其它多进程的浏览器都没这种问题。或者说在Firefox中页面的JavaScript代码是猥琐地跑在主线程上的。
  下面这个测试代码最好用Firefox开两个窗口,然后点击其中一个窗口上的按钮来测试。点击按钮后可以看到两个窗口的计时器同时停止。 0<br/>
<input type="button" value="Sleep5秒" id="sleep" />
<script>
(function callee(){
  document.body.firstChild.data++;
  setTimeout(callee);
})();
sleep.onclick=function(){
  for(var t=Date.now();Date.now()-t<5000;);
};
</script>
  如果此时尝试关闭窗口,浏览器就会抛出进程无响应的异常。
  不仅是Windows,在Ubuntu上测试也出现同样的问题。

  所以,对于大规模的计算,我们就别直接对在主线程上,它放入子线程中处理,比如创建一个Worker。 0<br/>
<input type="button" value="异步Sleep3秒后调用alert" id="sleep" />
<script>
(function callee(){
  document.body.firstChild.data++;
  setTimeout(callee);
})();
sleep.onclick=function(){
  new Worker('\
    data:text/javascript,\
    for(var t=Date.now();Date.now()-t<3000;);\
    postMessage("ok");\
  ').onmessage=function(e){
    alert(e.data);
  };
};
</script>
  当然,这么处理也是有一定局限性的,开发者能做的毕竟有限,关键还得靠Firefox在今后的版本中自己解决。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^