NodeJs多线程、多进程、定时任务

NodeJs多线程、多进程、定时任务,第1张

JS是单线程语言,减少了线程间切换的开销,且不用考虑锁的问题,因此适合IO密集型项目。

JS的单线程,其实指的是js主引擎线程的。除此之外还有定时器线程、异步http线程(ajax)等,最终通过Event Loop协调执行。

为了充分利用多核CPU,可以使用 worker_threads 实现多线程, child_process 或 cluster 实现多进程(master-worker模式)。

不同于浏览器中的 web worker ,nodejs中通过 worker_threads 实现多线程。通常在计算密集型场景中,才需要使用NodeJs多线程,因此使用场景较少。

electron中即经常使用该模块。

cluster 封装了 child_process.fork ,并内置了负载均衡,可有效实现多进程。

Nodejs的主进程是单线程的,但它有多线程处理方案(更准备来说是多进程方案),即主进程开启不同的子进程,主进程接收所有请求,然后将分发给其它不同的nodejs子进程处理。

它一般有两种实现:

Nodejs 的 cluster模式 用的就是第一种实现,它使用一个主线程 master 和多个子线程 worker ,形成一个集群,通过主线程来向子线程分发请求。cluster 实现了对 child_process 的封装,通过 fork 方法创建子进程的方式实现了多进程模型。

http 和 cluster 、 process 都是 nodejs 的内置模块,不需要额外安装

实现过程大概是这样的: cluster 模块应用 child_process 来创建子进程,子进程通过复写掉 cluster._getServer 方法,从而在 server.listen 来保证只有主进程监听端口,主子进程通过 IPC 进行通信,其次主进程根据平台或者协议不同,应用两种不同模块( round_robin_handle.js 和 shared_handle.js )进行请求分发给子进程处理。

PM2是后台进程管理器,是多进程方案的一个成熟应用,可以帮助管理和保持应用程序在线。

全局安装: npm install pm2@latest -g

它的使用也非常简单:

PM2对nodejs应用,可以根据系统自动实现负载均衡: pm2 start http-server.js -i max

我们肯定不想每次启动时,都要手动输入一堆指令,所以我们可以将这些配置统一使用配置文件来管理,注意js文件名必须是 xxx.config.js ,我这里用 ecosystem.config.js :

apps 数组中,可以放置多个对象,对应多个文件执行不同的配置

执行配置: pm2 start ecosystem.config.js --env dev

可以看到在启动后,桌面上生成了流水和错误日志:

大家都知道, nodejs是单进程单线程的,但是现在的服务器基本都是多核的,这导致了服务器资源的浪费,而且一旦程序出现未知异常, 就会使整个进程奔溃,导致服务不可用,那我们该如何来改善这样的情况呢?

注意 nodejs在底层使用了libuv库来实现多线程IO *** 作,其对用户不可见。但是nodejs的主程序还是运行在单进程单线程上。

运行程序并且记录到server.log可以看到

由于我的电脑是8核的,所以cluster会fork出来8个nodejs进程

可以看出来每个进程的nodejs接收到的请求很平均, cluster为我们自动做了负载均衡


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12147808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存