node的多进程和多线程是什么
导读:本文共2473字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: node.js中的多进程与多线程在node.js中,javascript代码的执行是单线程执行的,可是Node 本身其实是多线程的。node本身分为三层第一层,Node.js 标准库,这部分是由 Javascript编写的,即我们使用过程中直接能调用的 API,在源码中的 lib 目录下可以看到。第二层,Node bindings,这一层是 Javascript... ...
目录
(为您整理了一些要点),点击可以直达。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主线程中执行的,是单线程执行任务,如果有非常消耗时间的同步计算任务,将会阻塞其他代码的执行。
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 多线程
对比一下多线程与多进程:
采用多线程来解决上面代码的计算问题:
//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的多进程和多线程是什么的详细内容,希望对您有所帮助,信息来源于网络。