首页 > 解决方案 > 当我们说 Javascript 引擎 / nodejs 是单线程时,这是否意味着它在处理器中使用单个逻辑核心,仅此而已?

问题描述

我一直在阅读关于 JavaScript 实现是单线程的,所以我想知道这是否意味着它需要 CPU 的单个逻辑线程?还是软件线程与硬件线程完全不同?

标签: javascriptnode.jsv8

解决方案


(这里是 V8 开发人员。)

JavaScript 实现是单线程的

这不太正确。JavaScript作为一种语言是单线程的。这意味着它不会给你,程序员,说“请在这里启动一个新线程,与我的其他代码并行运行这个代码”。一次只能执行一个函数。新函数(例如,调度的回调)只能在当前执行的函数返回时开始执行。

(Web worker 与此并不矛盾。它们确实与您的主代码同时执行,但这不是 JavaScript 语言的特性。相反,浏览器环境为您提供了一种方法来生成单线程 JavaScript 执行环境的独立第二个实例.)

JavaScript实现,即引擎,可以随意使用任意数量的线程来执行后台任务。例如,当您使用异步 DOM 功能(如fetchAPI)时,通常另一个线程负责在后台(通常在另一个 CPU 内核上)完成工作(在本例中为获取)。一旦结果可用,就会安排一个回调,它必须等到单个主线程可以自由执行它。特别是对于 V8,我可以告诉你,它还使用后台线程来解析和编译 JavaScript 代码,以及垃圾收集。(其他引擎可能也这样做,但我也不知道它们。)

软件线程与硬件线程完全不同吗?

好吧,软件线程是要运行的“线程”/链/执行序列,而“硬件线程”是硬件执行它的能力。就个人而言,我认为“硬件线程”是一个令人困惑的误称,将其称为“(逻辑)CPU 核心”会更有意义;无论如何,它等于同一件事。

所以是的,单线程程序将在一个硬件线程上运行(或根本不运行)。JavaScript程序本身是单线程的(这是由语言定义的),但运行程序的引擎通常使用多个线程(即,在多个“硬件线程”/CPU 内核上运行的多个软件线程)。


推荐阅读