0

我试图从宏观角度了解我的代码是如何工作的。

我从这个SO Question中了解到并行编程是可能的,该问题链接到Resig的一篇关于web workers的文章。

我觉得这很令人困惑,因为我认为我已经阅读过浏览器中的 JavaScript 是单线程的。

也许我错配了一些东西。

某些浏览器是否支持多线程?这与并行处理相似还是相关?

4

2 回答 2

3

Web 浏览器中的 JavaScript 在语义行为上始终是单线程的。有一个名为“Web Workers”的新(ish)工具,它允许多个独立的 JavaScript 线程运行,但每个线程都看到一个世界,其中语义(除了一些特殊的特殊情况)正是人们在单线程事件中所期望的 -驱动环境。

主“页面”线程和每个工作线程之间的通信严格通过消息传递进行。将消息传递给工作人员(或页面线程)会触发一个事件,必须处理该事件才能接收到消息。

这是 MDN 对 Workers 的介绍。

编辑正如我在下面的评论中所写,对这个问题有不同的思考方式。浏览器(或任何其他 JavaScript 环境)可以同时运行许多不同的 JavaScript 执行线程。那是“多线程环境”吗?好吧,如果你喜欢我猜你可以这么称呼它。但是,从每个线程的角度来看,没有其他线程需要担心:只有要处理的事件和要通过平台 API 启动的操作(例如,DOM 交互、XHR 和 Workers)。这些 API 要么是同步的,要么不是。但是无需担心同步原语,无需与其他线程共享内存等。

于 2013-02-12T19:45:24.980 回答
1

你说 JS 是单线程是对的。

它实际上意味着编写的 javascript 代码由本机操作系统分配给浏览器的单个进程读取( parsed)和评估( )。executed

虽然可以给浏览器的线程数量没有限制,但直到一段时间以前,所有浏览器都相互使用一个线程,这是一种安全的方法(避免了复杂的时序问题和跨线程通信)。

自 HTML5 出现以来,浏览器制造商被迫引入 cookie 功能,例如Web Workers.

Web Workers 允许浏览器从操作系统请求超过 1 个线程并在每个线程中执行并行操作。

因此,开发人员有责任编写 JS 代码以确保进程没有依赖关系等,以便它们实际上可以独立工作。

在此处阅读有关它的HTML5 官方网站。不过与 Resig 的博客非常相似。

于 2013-02-12T19:54:56.337 回答