代码之家  ›  专栏  ›  技术社区  ›  g_b

当他们说JavaScript是单线程的时候,这意味着什么?

  •  1
  • g_b  · 技术社区  · 10 年前

    很多网站都说JavaScript是单线程的。当他们这么说的时候,他们是指JavaScript运行时吗?

    我可能有些误解,但JavaScript不只是一种编程语言吗?用它创建的程序应该是标记为单线程的程序吗?但也许我不明白什么,所以有人能解释一下我没有得到什么吗?

    2 回复  |  直到 10 年前
        1
  •  7
  •   T.J. Crowder    10 年前

    JavaScript 语言 ,对线程的话题几乎保持沉默。它是单线程还是多线程取决于它运行的环境。有单线程JavaScript环境,也有多线程的JavaScript环境。该规范唯一真正的要求是线程具有 job queue 并且一旦一个作业(一个要运行的代码单元,如对事件处理程序的调用)启动,它将在线程上运行到完成,然后再启动该队列中的另一个作业。也就是说,JavaScript具有 运行到完成 语义。

    浏览器上的JavaScript 不是 单线程,已经好几年没有了。有一个主线程(处理UI的线程) web worker 螺纹。web工作人员没有直接访问UI的权限,他们向UI线程发送消息,并进行UI更新。线程不直接共享数据,而是通过消息传递显式共享数据。这种分离使得编程多线程代码比多线程可以访问UI和相同的公共数据区域时更简单,更不容易出错。(编写正确的多线程代码,任何线程都可以随时访问任何内容 坚固的 .)

    在浏览器之外,NodeJS中的JavaScript在单个线程上运行。Node有一个分叉来添加多线程,但我认为它从未出现过。

    JVM(Rhino,Nashorn)上的JavaScript一直是多线程的,由JVM的线程功能支持。

        2
  •  2
  •   AndresM jonasoide    9 年前

    虽然TJC的答案当然是正确的,但我不认为它解决了人们所说的“JavaScript是单线程的”时的实际含义问题。他们实际上总结的(不准确的)是,运行时必须表现得好像只有一个执行线程,不能抢占,必须运行到完成。实际运行时可以做任何它喜欢的事情,只要最终结果是这样的。

    这意味着,虽然JavaScript程序看起来可能与许多相互交互的线程大量并行,但实际上并不是这样的 here .

    这与硬件描述语言(VHDL、Verilog、SystemC(虽然实际上不是一种语言)等等)面临的问题完全相同。它们给人一种巨大并行的错觉,因为在“进程”之间有一个运行时内核循环,这些进程不可抢占,并且必须运行到定义的挂起点。这样做的目的是确保以确定的、可重复的方式执行模型。

    HDL和JS之间的区别在于,这对于HDL来说是非常好的定义和基本的,而对于JS来说则被掩盖了。这是摘自 SystemC LRM ,简要介绍了它-它在 VHDL LRM 例如

    由于流程实例在不中断的情况下执行 流程实例可以在任何时间运行,而没有其他流程 实例可以执行,直到当前正在执行的流程实例 已将控制权交给内核。流程不得先发制人或 中断另一进程的执行。这被称为 协同例程语义或协同多任务。