Skip to content

JavaScript 如何处理大量数据

Published: at 10:32 AMSuggest Changes

有时候在思考 JS 是怎么处理大量数据的,不是很明白。

先看看这篇文章,讲的特别好:Nodejs 如何解决高并发? 还有这个:nodejs 中异步

Node 可以在不新增额外线程的情况下,依然可以对任务进行并发处理 —— Node.js 是单线程的。它通过事件循环(event loop)来实现并发操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

Node 单线程实现高并发原理

众所周知 Nodejs 是单线程且支持高并发的脚本语言。可为什么单线程的 Nodejs 可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解:

Node 的优点:I/O 密集型处理是 Node 的强项,因为 Node 的 I/O 请求都是异步的(如:sql 查询请求、文件流操作操作请求、http 请求…)

a. 什么是异步?

异步:发出操作指令,然后就可以去做别的事情了(主线程不需要等待),所有操作完成后再执行回调

b. 拥有异步 I/O 的 Node 为什么可以支持高并发呢?

因为 I/O 操作是由 Node 的工作线程去执行的(Nodejs 底层的 libuv 是多线程的线程池用来并行 io 操作),且主线程是不需要等待结果返回的,只要发出指令马上就可以去忙其他事情了。

额外知识点

c. 虽然 Nodejs 的 I/O 操作开启了多线程,但是所有线程都是基于 Node 服务进程开启的,并不能充分利用 cpu 资源

pm2 进程管理器可以解决这个问题

pm2 是一个带有负载均衡功能的 Node 应用的进程管理器.

d. cpu 核数与线程之间的关系

在过去单 CPU 时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。

虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 CPU,并交由操作系统来完成多任务间对 CPU 的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核 CPU 的情况下,同一时间点可以执行多个任务,具体到这个任务在 CPU 哪个核上运行,这个就跟操作系统和 CPU 本身的设计相关了

占位,等明白了补充文章

Nodejs 采用了这两种方式优点:上层使用单线程,避免多线程死锁,状态同步等问题;利用底层的多线程实现异步 I/O,充分利用了硬件资源以提升性能。

深入学习

Libuv 底层源码

参考文章


Previous Post
解决 TypeScript 错误:Window & typeof globalThis 上不存在属性 WebViewJavascriptBridge
Next Post
Vite 不压缩代码打包