当前位置: 首页 > news >正文

使用 Node.js 多进程提高任务执行效率

什么是 Node 多进程?

Node 是在单个线程中运行,我们虽然没办法开启额外的线程,但是可以开启进程集群。这样可以让下载任务和上传任务同时进行。

使用多进程进行初步代码优化

const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')async function runTask() {const { originUrl, targetUrl } = source.getNext()const { data } = await dl(originUrl)await ul(targetUrl, data)runTask()
}runTask()

这个代码逻辑上是没问题的,但是它只能在 1 个 CPU 核心中运行。

我们完全可以使用 Node.js 的多进程来利用 CPU 的多核心来增加这个程序的吞吐量。

怎么改造呢?

也非常简单。

const os = require('os')
const cluster = require('cluster')
const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')function run() {if(cluster.isMaster) {const numCPUs = os.cpus().length;for(let idx = 0; idx < numCPUs; idx++) {cluster.fork();}} else {runTask()}
}async function runTask() {const { originUrl, targetUrl } = source.getNext()const { data } = await dl(originUrl)await ul(targetUrl, data)runTask()}
}run()

在上面的代码中,我添加了 os 和 cluster 模块。os 模块可以告诉我们运行环境的 CPU 信息,我们可以通过它来做为创建进程数量的限制条件。然后通过 cluster.isMaster 来判断是否是主进程,因为只有主进程才拥有 fork 的能力。

worker 和 master 通信

其实上面的代码还可以继续做更深层次的优化,仔细分析一下,下载速度和上传速度其实是不一致的。通常来说,下载速度会很慢,但上传速度会很快。我们可以让其他进程去下载文件,当下载成功之后,让主进程去上传文件。
Node 中的多进程之间不会共享内存,所以我们可以通过消息传递的方式,让下载进程通知主进程去上传文件。

const os = require('os')
const cluster = require('cluster')
const dl = require('./download.js')
const ul = require('./upload.js')
const source = require('./source.js')function run() {if(cluster.isMaster) {const numCPUs = os.cpus().length;for(let idx = 0; idx < numCPUs; idx++) {const worker = cluster.fork();worker.on('message', ({ targetUrl, data }) => {ul(targetUrl, data)})}} else {runTask()}
}async function runTask() {const { originUrl, targetUrl } = source.getNext()const { data } = await dl(originUrl)process.send({ targetUrl, data })runTask()
}run()

可以在主进程中通过 worker.on(‘message’, (msg)=>{}) 的方式来监听子进程发送的消息。在子进程中通过 process.send 来向主进程发送消息。

总结

在 NodeJS 中使用多进程非常简单,合理使用多进程,可以解放硬件的能力,让软件的运行效率得到肉眼可见的提升。

http://www.lryc.cn/news/15847.html

相关文章:

  • [Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]
  • 50个 Pandas 高频操作技巧,建议收藏
  • pygraphviz安装教程
  • HarmonyOS Connect认证测试
  • Datawhale团队第九期录取名单!
  • ChatGPT 的原理与未来研究方向
  • 基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架主入口main解析
  • 华为OD机试真题Python实现【挑选字符串】真题+解题思路+代码(20222023)
  • Orcad放置字符标注、文本框、注释及图片方法教程
  • 秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进
  • koc转化效果评估模型是什么?如何根据模型来进行投放
  • vuejs-datepicker|简单易用的Vue.js日期选择组件
  • 【c++】类和对象3—初始化列表、类对象作为类成员、静态成员
  • 【基础算法】数的范围
  • FreeRTOS入门(01):基础说明与使用演示
  • 华为OD机试真题Python实现【交换字符】真题+解题思路+代码(20222023)
  • Word处理控件Aspose.Words功能演示:使用 Java 在 MS Word 文档中进行邮件合并
  • 产品未出 百度朋友圈“开演”
  • emacs 中的键盘宏
  • TCP/IP网络编程——关于 I/O 流分离的其他内容
  • 【BCT认证_组播DNS】 DNS SRV RR
  • 【验证码的识别】—— 点触式验证码的识别
  • 深入浅出C++ ——priority_queue类深度剖析
  • 117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)
  • 什么是Struts2?有哪些优势
  • Ubuntu22.04 安装Mongodb6.X
  • 启动内核,能启动内核但是无法进入内核,始终卡在某一地方,比如 No soundcards found.
  • SQL零基础入门学习(六)
  • 股票、指数、快照、逐笔... 不同行情数据源的实时关联分析应用
  • 华为OD机试真题Python实现【 不含 101 的数】真题+解题思路+代码(20222023)