node的多进程和多线程是什么(node,web开发)

时间:2024-05-04 22:29:20 作者 : 石家庄SEO 分类 : web开发
  • TAG :

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

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

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

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主线程中执行的,是单线程执行任务,如果有非常消耗时间的同步计算任务,将会阻塞其他代码的执行。

constKoa=require('koa');constapp=newKoa();app.use(async(ctx)=>{consturl=ctx.request.url;if(url==='/'){ctx.body={name:'xxx',age:14}}if(url==='/compute'){letsum=0for(leti=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.jsconstKoa=require('koa');constapp=newKoa();const{Worker}=require('worker_threads')app.use(async(ctx)=>{consturl=ctx.request.url;if(url==='/'){ctx.body={name:'xxx',age:14}}if(url==='/compute'){constsum=awaitnewPromise(resolve=>{constworker=newWorker(__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')letsum=0for(leti=0;i<1000000000;i++){sum+=i}//发送信息parentPort.postMessage(sum)

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

//api.jsconstKoa=require('koa');constapp=newKoa();const{fork}=require('child_process')app.use(async(ctx)=>{consturl=ctx.request.url;if(url==='/'){ctx.body={name:'xxx',age:14}}if(url==='/compute'){constsum=awaitnewPromise(resolve=>{constworker=fork(__dirname+'/compute.js')worker.on('message',data=>{resolve(data)})})ctx.body={sum}}})app.listen(4000,()=>{console.log('http://localhost:4000/start')})//computer.jsletsum=0for(leti=0;i<1000000000;i++){sum+=i}process.send(sum)
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:node的多进程和多线程是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:php的cli概念是什么及怎么使用下一篇:

12 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18