核心要点
JavaScript运行时使用单线程处理。引擎一次只执行一项操作,必须完成执行才能执行其他任何操作。这在浏览器中很少会导致问题,因为单个用户与应用程序交互。但是,Node.js应用程序可能正在处理数百个用户请求。多线程可以防止应用程序中的瓶颈。考虑一个Node.js Web应用程序,其中单个用户可以触发一个复杂的、耗时10秒的JavaScript计算。在该计算完成之前,应用程序将无法处理来自任何其他用户的传入请求。PHP和Python等语言也是单线程的,但它们通常使用多线程Web服务器,该服务器在每个请求上启动解释器的新的实例。这是资源密集型的,因此Node.js应用程序通常提供自己的轻量级Web服务器。Node.js Web服务器在单线程上运行,但JavaScript通过其非阻塞事件循环来减轻性能问题。应用程序可以异步执行在其他操作系统线程上运行的文件、数据库和HTTP等操作。事件循环继续运行,并且可以在等待I/O操作完成时处理其他JavaScript任务。不幸的是,长时间运行的JavaScript代码(例如图像处理)可能会占用事件循环的当前迭代。本文解释了如何使用以下方法将处理转移到另一个线程:- 工作线程 - 子进程 - 集群 - 进程管理器 - 容器
Node.js工作线程
工作线程相当于Node.js中的Web Worker。主线程将数据传递给另一个脚本,该脚本在单独的线程上(异步)处理它。主线程继续运行,并在工作线程完成其工作时运行回调事件。
请注意,JavaScript使用其结构化克隆算法在将数据传递到工作线程和从工作线程传递数据时将其序列化为字符串。它可以包含本机类型,例如字符串、数字、布尔值、数组和对象——但不包括函数。您将无法传递复杂的对象——例如数据库连接——因为大多数对象都具有无法克隆的方法。但是,您可以:- 在主线程中异步读取数据库数据并将结果数据传递给工作线程。- 在工作线程中创建另一个连接对象。这将产生启动成本,但如果您的函数需要进一步的数据库查询作为计算的一部分,则可能是可行的。
Node.js工作线程API在概念上类似于浏览器中的Web Workers API,但是存在句法差异。Deno和Bun都支持浏览器和Node.js API。
工作线程演示
以下演示显示一个Node.js进程,该进程每秒将当前时间写入控制台:在一个新的浏览器选项卡中打开Node.js演示。然后,在主线程上启动一个长时间运行的掷骰子计算。循环完成1亿次迭代,这会停止时间的输出:
<code>timer process 12:33:18 PM timer process 12:33:19 PM timer process 12:33:20 PM NO THREAD CALCULATION STARTED... ┌─────────┬──────────┐ │ (index) │ Values │ ├─────────┼──────────┤ │ 2 │ 2776134 │ │ 3 │ 5556674 │ │ 4 │ 8335819 │ │ 5 │ 11110893 │ │ 6 │ 13887045 │ │ 7 │ 16669114 │ │ 8 │ 13885068 │ │ 9 │ 11112704 │ │ 10 │ 8332503 │ │ 11 │ 5556106 │ │ 12 │ 2777940 │ └─────────┴──────────┘ processing time: 2961ms NO THREAD CALCULATION COMPLETE timer process 12:33:24 PM </code>
完成之后,相同的计算将在工作线程上启动。在骰子处理发生时,时钟继续运行:
<code>WORKER CALCULATION STARTED... timer process 12:33:27 PM timer process 12:33:28 PM timer process 12:33:29 PM ┌─────────┬──────────┐ │ (index) │ Values │ ├─────────┼──────────┤ │ 2 │ 2778246 │ │ 3 │ 5556129 │ │ 4 │ 8335780 │ │ 5 │ 11114930 │ │ 6 │ 13889458 │ │ 7 │ 16659456 │ │ 8 │ 13889139 │ │ 9 │ 11111219 │ │ 10 │ 8331738 │ │ 11 │ 5556788 │ │ 12 │ 2777117 │ └─────────┴──────────┘ processing time: 2643ms WORKER CALCULATION COMPLETE timer process 12:33:30 PM </code>
工作进程比主线程快一点,因为它可以专注于一项任务。
...(剩余内容省略,因为篇幅过长。 核心思想已在前面总结,后续内容为代码示例和更详细的解释,可以根据需要选择性阅读原文。)
以上是node.js多线程的简介的详细内容。更多信息请关注PHP中文网其他相关文章!