Node.js使用多进程提高任务执行效率
最近我有个学员写了个 Node.js 脚本程序,定时从某个服务器下载文件,并向另一个云服务商上传文件。
但是每次只能先下载一个文件,再去上传一个文件。效率比较低。于是他向我请教,怎么样才能提高效率?我告诉他应该用 Node 的多进程技术。
什么是 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 中使用多进程非常简单,合理使用多进程,可以解放硬件的能力,让软件的运行效率得到肉眼可见的提升。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
相关文章
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
这篇文章主要介绍了Node Express用法,结合实例形式详细分析了node.js Express安装、使用、路由、中间件、模板引擎等相关概念、原理及操作注意事项,需要的朋友可以参考下2020-05-05Node.js中Bootstrap-table的两种分页的实现方法
这篇文章主要介绍了Node.js中Bootstrap-table的两种分页的使用方法,需要的朋友可以参考下2017-09-09Nodejs把接收图片base64格式保存为文件存储到服务器上
这篇文章主要介绍了Nodejs把接收图片base64格式保存为文件存储到服务器上,文中代码较简短,需要的朋友可以参考下2018-09-09nodejs16.15.0版本如何解决node-sass和sass-loader版本冲突问题
这篇文章主要介绍了nodejs16.15.0版本如何解决node-sass和sass-loader版本冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08Node.js基于node-schedule实现定时任务的操作步骤
实际工作中,可能会遇到定时清除某个文件夹内容,定时发送消息或发送邮件给指定用户,定时导出某些数据等,node-schedule是一个非常不错的npm包,可以帮助我们快速的创建和管理定时任务,所以本文介绍了Node.js基于node-schedule实现定时任务的操作步骤,需要的朋友可以参考下2024-09-09nodejs使用PassThrough流进行数据传递合并示例详解
这篇文章主要为大家介绍了nodejs使用PassThrough流进行数据传递合并示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-09-09
最新评论