首页 >web前端 >js教程 >node.js多线程的简介

node.js多线程的简介

Lisa Kudrow
Lisa Kudrow原创
2025-02-08 13:14:10768浏览

An Introduction to Node.js Multithreading

核心要点

  • JavaScript运行时使用单线程处理,这可能导致Node.js应用程序在处理多个用户请求时出现瓶颈。多线程有助于防止这些瓶颈。
  • Node.js工作线程允许在单独的线程上进行异步处理,从而提高性能。但是,它们无法处理诸如数据库连接之类的复杂对象,并且在传递到工作线程和从工作线程传递数据时必须对数据进行序列化。
  • Node.js子进程可以启动另一个应用程序,传递数据并接收结果。它们不如工作线程高效,并且更耗费进程资源,但可以在依赖Node.js外部进程时使用。
  • Node.js集群允许分叉相同的进程以更有效地处理负载。它们还可以处理实例失败时的重启,并在分叉的进程之间进行通信,但是代码可能会变得越来越复杂。
  • 进程管理器和容器编排可以在无需编写集群代码的情况下运行多个Node.js应用程序实例,因此它们非常适合实时服务器。容器模拟操作系统,允许应用程序在单个设备上或数千台机器上运行。

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。主线程将数据传递给另一个脚本,该脚本在单独的线程上(异步)处理它。主线程继续运行,并在工作线程完成其工作时运行回调事件。

An Introduction to Node.js Multithreading

请注意,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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn