失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 一文聊聊node的多进程和多线程

一文聊聊node的多进程和多线程

时间:2023-12-10 20:15:28

相关推荐

一文聊聊node的多进程和多线程

web前端|js教程

node,多进程,多线程

web前端-js教程

本篇文章带大家了解一下node.js,介绍一下node中的多进程和多线程,对比一下多进程和多线程,希望对大家有所帮助!

php mysql 论坛源码,ubuntu共存要多久,tomcat加密算法配置,内网python爬虫,php教程9.2.4学习,郑州搜索引擎seo推广有用吗lzw

521系统代挂源码,vscode展开代码块快捷键,cab引导ubuntu,乌班图启动tomcat脚本,爬虫与pandas,前端需要学php吗,青海短视频seo怎么做lzw

node.js中的多进程与多线程

安卓 2048 源码,vscode程序运行时间,ubuntu终端卡死,tomcat错误日志查询,爬虫web s,php生成数字验证码,seo伪原创还有价值吗lzw

在node.js中,javascript代码的执行是单线程执行的,可是Node 本身其实是多线程的。

node本身分为三层

第一层,Node.js 标准库,这部分是由 Javascript编写的,即我们使用过程中直接能调用的 API,在源码中的 lib 目录下可以看到。

第二层,Node bindings,这一层是 Javascript 与底层 C/C++ 能够沟通的关键,前者通过 bindings 调用后者,相互交换数据,是第一层和第三层的桥梁。

第三层,是支撑 Node.js 运行的关键,由 C/C++ 实现,是node实现的一些底层逻辑。

其中,第三层的Libuv,为 Node.js 提供了跨平台,线程池,事件池,异步 I/O 等能力,是 Node.js 如此强大的关键。

由于Libuv提供了事件循环机制,所以在io处理方面,javascript并不会发生阻塞,所以我们用node搭建web服务时,并不需要担心io量过大,导致其他请求阻塞。

可是,非io任务的执行,是在node主线程中执行的,是单线程执行任务,如果有非常消耗时间的同步计算任务,将会阻塞其他代码的执行。

const Koa = require(koa);const app = new Koa();app.use(async (ctx) => { const url = ctx.request.url; if (url === /) { ctx.body = {name: xxx, age: 14} } if(url===/compute){ let sum=0 for (let i = 0; i { console.log(http://localhost:4000/ start)})

上面这串代码,如果http请求了/compute,node会调用cpu进行大量的计算,这时如果有其他http请求进入,将会发生阻塞。

那么如何解决这个问题呢?

有两种方案,一种是使用children_process或者cluster开启多进程进行计算,一种是使用worker_thread开启多线程进行计算

多进程 vs 多线程

对比一下多线程与多进程:

采用多线程来解决上面代码的计算问题:

//api.jsconst Koa = require(koa);const app = new Koa();const {Worker} = require(worker_threads)app.use(async (ctx) => { const url = ctx.request.url; if (url === /) { ctx.body = {name: xxx, age: 14} } if (url === /compute) { const sum = await new Promise(resolve => { const worker = new Worker(__dirname+/compute.js)//接收信息 worker.on(message, data => {resolve(data) }) }) ctx.body = {sum} }})app.listen(4000, () => { console.log(http://localhost:4000/ start)})//computer.jsconst {parentPort}=require(worker_threads)let sum=0for (let i = 0; i <1000000000 ; i++) { sum+=i}//发送信息parentPort.postMessage(sum)

采用多进程来解决上面代码的计算问题:

//api.jsconst Koa = require(koa);const app = new Koa();const {fork} = require(child_process)app.use(async (ctx) => { const url = ctx.request.url; if (url === /) { ctx.body = {name: xxx, age: 14} } if (url === /compute) { const sum = await new Promise(resolve => {const worker =fork(__dirname+/compute.js) worker.on(message, data => {resolve(data) }) }) ctx.body = {sum} }})app.listen(4000, () => { console.log(http://localhost:4000/ start)})//computer.jslet sum=0for (let i = 0; i <1000000000 ; i++) { sum+=i}process.send(sum)

nodejs 教学!

如果觉得《一文聊聊node的多进程和多线程》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。