`

Javascript 的运行及浏览器多线程

阅读更多


  一。本文目的

  网页HTML结构以及 Javascript 程序越来越复杂了,有必要整理一下思路。

  本文只是想整理一下思路,很多细节不一定准确。


  二。问题详述

  现在一个网页中包含了多个 Iframe(Frame),每个 Iframe 都有 window (本文中 window 特指 DOM 中的 window,MS Windows 中的窗口与 X Window 中的窗口用 WINDOW 来表示),每个 window 都可以有 setInterval,以及 setTimeout,另外 window.document 里面还有很多的 element,每个 element 都可以有 event,而且这些 event 可以一直 bubble 到 body。

  问题 1. 在一个 window 内部,event 与 window.setInterval / window.setTimeout 是否并行?
  问题 2. window 之间的 Javascript 是否并行?
  问题 3. 属于同一个进程的 WINDOW 之间的 Javascript 是否并行?
  问题 4. 如果有并行存在,是一种怎么样的并行? 是浏览器为每一个 window 或 WINDOW 模拟了多线程,还是利用操作系统本身的多线程?
  问题 5. 如果有并行存在,如何解决 Javascript 运行中的互斥、信号?


  三。初步认识

  经过一些简单研究(因为懒,没去读 Firefox 源代码),有以下初步认识。

  对于 IE,用 SPY++ 分析,发现增加页面中的 Iframe 并不能导致线程的增加,也不能导致子 WINDOW 的增加。所以,IE 中的 Iframe 及 window 是 Shell.Explorer (shdocvw.dll 中的 COM 组件) 内部实现的,可能在一个单独的线程中,很可能就在 WINDOW 所属的线程中。进一步,WINDOW 中所有 Iframe 的 window 的内部的 Javascript 都是不并行的。再进一步,结合网络传输,如果一个 Iframe.src 赋值后,Javascript 所在的线程应该会通知另一个线程(本文中简称通讯线程)去向服务器发 HTTP 请求。通讯线程从服务器端接收了一个完整的 HTTP 包后,将把这个数据包交给负责显示的线程(中间环节可能有一个线程负责解析 html),显示线程(或解析线程)边显示边运行页面中的 Javascript,例如 document.write()。并不停的绘制屏幕。而在这个 HTTP 数据包处理过程中,并不会处理其他 Iframe 的 window 的 setInterval 之类的事件。处理完一件事情后,才会在内部的 timer / timeout 队列中选择一个到期的开始运行(调用)。

  所以,如果有一个 Iframe 的 window 的 Javascript 陷入死循环,则此线程内的所有的 Iframe 都将停止响应,并且从服务器端接收来的新数据也将被搁置。

  IE 中的多线程。在 IE 上按 Ctrl-N,或者运行 window.open() ,将会打开一个新的 WINDOW,从 SPY++ 中看,会相应的增加一个新线程,管理这个新的 WINDOW。但是没有增加更多的新线程,说明一个进程内所有的 WINDOW 都共用了通讯线程。也就是通讯进程管理了所有的 TCP Connection。 用 window.open() 返回的对象指针可以访问这个新 WINDWO,并且可以访问其下的 Iframe 的 window 中的各种数据,甚至也可以调用其中的函数,只是需要注意堆栈的不同。经过测试,如果两个线程的 Javascript 同时访问同一个数据,比如同时有 window.setInterval 指定的函数去访问一个 window 中的一个 element 的变量,或者修改属性,则其中的一个函数会返回 Javascript Exception:拒绝访问,说明浏览器在内部实现中注意了互斥。

  基于以上认识,对于 IE ,在一个 WINDOW 的所有 Iframe 的 window 内部应该不存在多线程,也不存在 Javascript 并行。当然也不会有 sleep 之类的函数了。把一个 Javascript 函数阻塞了(如特定的 ActiveX )可能导致整个 WINDOW 暂停相应。

  关于 IE 还有一个发现,window.setInterval 不是用 WM_TIMER 实现的。

  关于 Firefox,在 Windows 上,用 SPY++ 分析,页面中的每一个 Iframe 都是用一个 WINDOW 实现的。但是所有的 WINDOW,包括其他 Tab 打开的 WINDOW,都属于一个线程。但是跨 Tab ,跨浏览器窗口访问同时访问一个数据,也会引发 Javascript Exception:拒绝访问,说明 Firefox 的 Javascript 很可能是在一个 Tab 范围内,是不并行的。有可能是 Firefox 给每个 Tab 单独开了一个线程来运行 Javascript。反正最终行为要与 IE 保持差不多,估计也就这样了。

  在 Linux(FC6)上启动 Firefox,用 gdb attach 进去,发现在新打开网页时会增加不少线程,但网页显示稳定后过一段时间,线程数会减少。这也可能是因为运行 Javascript 的线程任务做完了。


  四。初步结论

  1. 在 IE 的一个 WINDOW 内,Firefox 的一个 Tab 内, Javascript 是单线程运行的。
  2. 如果要在页面上的各 Iframe 之间实现 Javascript 同步,则应该采用 window.setInterval 来实现,而不是把一个 Javascript 挂起。
  3. 在 IE 上跨 WINDOW,或在 Firefox 上跨 Tab 访问数据,则要注意用 try catch 解决线程互斥导致的 Exception。


(2006.12)

分享到:
评论

相关推荐

    javascript模拟多线程

    1. Web Workers:Web Workers是HTML5引入的一个特性,允许JavaScript在后台线程中运行脚本,从而实现多线程。通过创建Worker对象,可以将计算密集型任务分配到子线程,主线程则继续处理UI交互。 2. Service Workers...

    JavaScript单线程还是多线程

    这意味着在任何时候,JavaScript引擎只会执行一个任务,避免了多线程可能导致的竞态条件和死锁问题。 然而,随着Web应用复杂性的增加,单线程模型的限制逐渐显现,如处理大量计算或长时间阻塞的I/O操作时,会阻塞...

    JavaScript多线程的实现方法(gif).txt

    ### JavaScript多线程的实现方法 #### 背景与概念 在JavaScript中,传统的单线程模型限制了其在复杂应用中的性能表现。随着Web应用程序功能日益强大,多线程的支持变得越来越重要。虽然原生JavaScript是基于事件...

    详解主流浏览器多进程架构:Chrome、IE

    ### 详解主流浏览器多进程架构:Chrome、IE 随着互联网技术的飞速发展,Web浏览器已成为现代生活中不可或缺的一部分。然而,网络安全威胁也随之增加,包括恶意软件、木马、间谍软件等,对用户的安全和隐私构成了...

    一个JavaScript多线程函数库

    为了解决这个问题,JavaScript社区引入了一些机制来模拟多线程,例如Web Workers。 "一个JavaScript多线程函数库"的目标就是提供这样的解决方案,允许开发者并行执行多个JS函数,提高应用性能。这个库可能利用Web ...

    一个JavaScript多线程函数库 使用说明

    然而,随着技术的发展,JavaScript已经引入了多线程功能,以应对现代Web应用的需求。本文将深入探讨一个JavaScript多线程函数库的使用方法,帮助开发者更好地理解和利用这一特性。 ### 一、Web Workers:JavaScript...

    javascript经典特效---浏览器毁灭者-请小心使用.rar

    8. **Web Worker**:虽然Web Worker可以提高多线程处理能力,但滥用或不当使用也可能导致资源浪费。 9. **浏览器兼容性**:不同的浏览器对JavaScript的实现可能存在差异,某些极端的代码可能在某些浏览器上运行良好...

    JavaScript是否可实现多线程 深入理解JavaScript定时机制

    这意味着虽然JavaScript本身是单线程运行的,但它可以借助浏览器提供的多线程能力进行异步操作。具体来说,当JavaScript代码需要进行耗时操作时,比如网络请求或定时器,它不是在当前线程中执行这些操作,而是将它们...

    javascript多线程

    需要注意的是,不同的浏览器对JavaScript多线程的支持程度不同,开发时应确保在目标环境中能正常运行。此外,由于安全和性能原因,浏览器对Worker的内存和CPU使用都有一定的限制。 总结来说,JavaScript多线程主要...

    易语言源码多个客户多页面浏览器.7z

    1. **多线程技术**:为了实现多页面并行加载,易语言源码通常会采用多线程技术,确保各个页面的加载互不干扰,提高整体性能。 2. **网络通信模块**:浏览器的核心是与Web服务器的交互,易语言需要搭建有效的网络...

    js多线程--很好用的东东

    标题“js多线程--很好用的东东”暗示我们将讨论JavaScript中的多线程解决方案,这可能包括Web Workers、Service Workers或其他相关技术。这些技术允许JavaScript在后台运行额外的线程,以便在不影响主线程的情况下...

    FireBreath_多线程及调用JS例子

    "FireBreath_多线程及调用JS例子"这个压缩包显然包含了关于如何在FireBreath插件中实现多线程以及与JavaScript交互的示例代码。 多线程在软件开发中是非常重要的一个概念,特别是在处理耗时任务或者需要并行处理...

    JavaScript多线程编程简介.txt

    ### JavaScript多线程编程简介 #### 一、引言 在传统的JavaScript开发中,由于其单线程特性,处理复杂的异步操作时容易...随着未来浏览器对更多多线程特性的支持,JavaScript的多线程编程将会变得更加简单和强大。

    多线程访问网页

    在多线程环境下,程序可以同时进行多个任务,比如在一个线程中加载网页内容,另一个线程处理用户输入,提高整体的运行效率。 二、多线程访问网页的原理 在访问网页时,多线程技术可以用于并行下载网页资源。当...

    详解Python多线程Selenium跨浏览器测试.pdf

    本文主要探讨了如何使用Python和Selenium库进行自动化跨浏览器测试,并利用多线程技术提高测试效率。 首先,理解跨浏览器测试的含义是关键。这是一种功能测试策略,旨在验证web应用在不同的浏览器(如IE、Firefox、...

    Concurrent.Thread.js javascript多线程

    在JavaScript的世界里,由于其单线程执行的特性,处理大量计算或长时间运行的任务时,可能会阻塞浏览器的UI更新,导致用户体验下降。为了解决这个问题,开发者们引入了各种多线程解决方案,如Web Workers。`...

    office文档通过openoffice或者microsoft多线程转换成pdf文档并通过pdfjs显示

    标题提到的"office文档通过openoffice或者microsoft多线程转换成pdf文档"涉及到的技术主要包括办公软件API接口利用、多线程处理以及文件转换技术。首先,OpenOffice和Microsoft Office都提供了能够读取和操作Office...

    闪虎浏览器多页版(易语言)

    1. **多线程处理**:为了实现多页浏览功能,浏览器内部可能采用了多线程技术,每个标签页运行在一个独立的线程中,这样可以避免一个页面的加载阻塞其他页面,提高用户体验。 2. **内存管理**:多页浏览需要对内存...

Global site tag (gtag.js) - Google Analytics