千家信息网

node的多进程和多线程是什么

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,今天小编给大家分享一下node的多进程和多线程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
千家信息网最后更新 2025年01月19日node的多进程和多线程是什么

今天小编给大家分享一下node的多进程和多线程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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

在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 <100000000000 ; i++) {        sum+=i            }        ctx.body={sum}    }})app.listen(4000, () => {    console.log('http://localhost:4000/ start')})

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

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

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

多进程 vs 多线程

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

属性多进程多线程比较
数据数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,同步复杂各有千秋
CPU、内存占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高多线程更好
销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快多线程更好
coding编码简单、调试方便编码、调试复杂编码、调试复杂
可靠性进程独立运行,不会相互影响线程同呼吸共命运多进程更好
分布式可用于多机多核分布式,易于扩展只能用于多核分布式多进程更好

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

//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)

以上就是"node的多进程和多线程是什么"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

0