iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Node.js中进程与线程的作用是什么
  • 695
分享到

Node.js中进程与线程的作用是什么

2024-04-02 19:04:59 695人浏览 泡泡鱼
摘要

本篇内容主要讲解“node.js中进程与线程的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node.js中进程与线程的作用是什么”吧!1. 回顾进程

本篇内容主要讲解“node.js中进程与线程的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习node.js中进程与线程的作用是什么”吧!

1. 回顾进程和线程的定义

  • 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

  • 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

2. Node.js的单线程

Node特点主线程是单线程的 一个进程只开一个主线程,基于事件驱动的、异步非阻塞I/O,可以应用于高并发场景。

nodejs中没有多线程,为了充分利用多核cpu,可以使用子进程实现内核的负载均衡,那我们就要解决以下问题:

  • Node.js 做耗时的计算时候阻塞问题。

  • Node.js如何开启多进程。

  • 开发过程中如何实现进程守护。

3. 场景实例

const Http = require('http'); http.createServer((req,res)=>{     if(req.url === '/sum'){ // 求和         let sum = 0;         for(let i = 0 ; i < 10000000000 ;i++){             sum+=i;         }         res.end(sum+'')     }else{         res.end('end');     } }).listen(3000); // 这里我们先访问/sum,在新建一个浏览器页卡访问/  // 会发现要等待/sum路径处理后才能处理/路径

4. 开启进程

Node.js 进程创建,是通过child_process模块实现的:

  • child_process.spawn() 异步生成子进程。

  • child_process.fork() 产生一个新的Node.js进程,并使用建立的IPC通信通道调用指定的模块,该通道允许在父级和子级之间发送消息。

  • child_process.exec() 产生一个shell并在该shell中运行命令。

  • child_process.execFile() 无需产生shell。

4.1. spawn

spawn 产卵,可以通过此方法创建一个子进程:

let { spawn } = require("child_process"); let path = require("path"); // 通过node命令执行sub_process.js文件 let childProcess = spawn("node",['sub_process.js'], {   cwd: path.resolve(__dirname, "test"), // 找文件的目录是test目录下   stdio: [0, 1, 2]  }); // 监控错误 childProcess.on("error", function(err) {   console.log(err); }); // 监听关闭事件 childProcess.on("close", function() {   console.log("close"); }); // 监听退出事件 childProcess.on("exit", function() {   console.log("exit"); });  stido 这个属性非常有特色,这里我们给了0,1,2这三个值分别对应住进程的 process.stdin , process.stdout 和 process.stderr 这代表着主进程和子进程共享标准输入和输出:
let childProcess = spawn("node",['sub_process.js'], {   cwd: path.resolve(__dirname, "test"), // 找文件的目录是test目录下   stdio: [0, 1, 2]  });

可以在当前进程下打印 sub_process.js 执行结果默认在不提供stdio参数时为 stdio:['pipe'] ,也就是只能通过流的方式实现进程之间的通信:

let { spawn } = require("child_process"); let path = require("path"); // 通过node命令执行sub_process.js文件 let childProcess = spawn("node",['sub_process.js'], {   cwd: path.resolve(__dirname, "test"),   stdio:['pipe'] // 通过流的方式 }); // 子进程读取写入的数据 childProcess.stdout.on('data',function(data){     console.log(data); }); // 子进程像标准输出中写入 process.stdout.write('hello');

使用 ipc 方式通信,设置值为 stdio:['pipe','pipe','pipe','ipc'] 可以通过 on('message') 和 send 方式进行通信:

let { spawn } = require("child_process"); let path = require("path"); // 通过node命令执行sub_process.js文件 let childProcess = spawn("node",['sub_process.js'], {   cwd: path.resolve(__dirname, "test"),   stdio:['pipe','pipe','pipe','ipc'] // 通过流的方式 }); // 监听消息 childProcess.on('message',function(data){     console.log(data); }); // 发送消息 process.send('hello');

还可以传入 ignore 进行忽略,传入 inherit 表示默认共享父进程的标准输入和输出。

产生独立进程:

let { spawn } = require("child_process"); let path = require("path"); // 通过node命令执行sub_process.js文件 let child = spawn('node',['sub_process.js'],{     cwd:path.resolve(__dirname,'test'),     stdio: 'ignore',     detached:true // 独立的线程 }); child.unref(); // 放弃控制

4.2. fork

衍生新的进程,默认就可以通过 ipc 方式进行通信:

let { fork } = require("child_process"); let path = require("path"); // 通过node命令执行sub_process.js文件 let childProcess = fork('sub_process.js', {   cwd: path.resolve(__dirname, "test"), }); childProcess.on('message',function(data){     console.log(data); });

fork 是基于 spawn 的,可以多传入一个 silent 属性来设置是否共享输入和输出。

fork原理:

function fork(filename,options){     let stdio = ['inherit','inherit','inherit']     if(options.silent){ // 如果是安静的  就忽略子进程的输入和输出         stdio = ['ignore','ignore','ignore']     }     stdio.push('ipc'); // 默认支持ipc的方式     options.stdio = stdio     return spawn('node',[filename],options) }

到了这里我们就可以解决“3.场景实例”中的场景实例了:

const http = require('http'); const {fork} = require('child_process'); const path = require('path'); http.createServer((req,res)=>{     if(req.url === '/sum'){         let childProcess = fork('calc.js',{             cwd:path.resolve(__dirname,'test')         });         childProcess.on('message',function(data){             res.end(data+'');         })     }else{         res.end('ok');     } }).listen(3000);

4.3. execFile

通过 node 指令,直接执行某个文件:

let childProcess = execFile("node",['./test/sub_process'],function(err,stdout,stdin){     console.log(stdout);  });

内部调用的是  spawn 方法。

4.4. exec

let childProcess = exec("node './test/sub_process'",function(err,stdout,stdin){     console.log(stdout) });

内部调用的是 execFile ,其实以上三个方法都是基于 spawn 的。

5. cluster

Node.js的单个实例在单个线程中运行。为了利用多核系统,用户有时会希望启动Node.js进程集群来处理负载。 自己通过进程来实现集群。

子进程与父进程共享HTTP服务器 fork实现:

let http = require('http'); let {     fork } = require('child_process'); let fs = require('fs'); let net = require('net'); let path = require('path'); let child = fork(path.join(__dirname, '8.child.js')); let server = net.createServer(); server.listen(8080, '127.0.0.1', function () {     child.send('server', server);     console.log('父进程中的服务器已经创建');     let httpserver = http.createServer();     httpServer.on('request', function (req, res) {         if (req.url != '/favicon.ico') {             let sum = 0;             for (let i = 0; i < 100000; i++) {                 sum += 1;             }             res.write('客户端请求在父进程中被处理。');             res.end('sum=' + sum);         }     });     httpServer.listen(server); });
let http = require('http'); process.on('message', function (msg, server) {     if (msg == 'server') {         console.log('子进程中的服务器已经被创建');         let httpServer = http.createServer();         httpServer.on('request', function (req, res) {             if (req.url != '/favicon.ico') {                 sum = 0;                 for (let i = 0; i < 10000; i++) {                     sum += i;                 }                 res.write('客户端请求在子进程中被处理');                 res.end('sum=' + sum);             }         });         httpServer.listen(server);     } });

进程与父进程共享Socket对象:

let {     fork } = require('child_process'); let path = require('path'); let child = fork(path.join(__dirname, '11.socket.js')); let server = require('net').createServer(); server.on('connection', function (socket) {     if (Date.now() % 2 == 0) {         child.send('socket', socket);     } else {         socket.end('客户端请求被父进程处理!');     } }); server.listen(41234, );
process.on('message', function (m, socket) {     if (m === 'socket') {         socket.end('客户端请求被子进程处理.');     } });

使用cluster模块更加方便:

let cluster = require("cluster"); let http = require("http"); let cpus = require("os").cpus().

到此,相信大家对“Node.js中进程与线程的作用是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Node.js中进程与线程的作用是什么

本文链接: https://www.lsjlt.com/news/66246.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js中进程与线程的作用是什么
    本篇内容主要讲解“Node.js中进程与线程的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中进程与线程的作用是什么”吧!1. 回顾进程...
    99+
    2024-04-02
  • Node.js中的进程和线程是什么
    这篇文章主要介绍“Node.js中的进程和线程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中的进程和线程是什么”文章能帮助大家解决问题。一、进...
    99+
    2024-04-02
  • Node.js中Worker线程的作用是什么
    今天就跟大家聊聊有关Node.js中Worker线程的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Node.js 中 CPU 密集型应用的历史在 worker 线程之前,...
    99+
    2023-06-14
  • Node.js中的进程、线程、协程与并发模型是什么
    这篇文章主要介绍“Node.js中的进程、线程、协程与并发模型是什么”,在日常操作中,相信很多人在Node.js中的进程、线程、协程与并发模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • php线程与进程的关系是什么
    PHP是一种脚本语言,通常被解释器逐行执行。在PHP中,线程和进程是操作系统级别的概念,与PHP本身的语言特性关系不大。线程是进程的...
    99+
    2023-09-27
    php
  • 进程与线程异同点是什么
    这篇文章主要讲解了“进程与线程异同点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“进程与线程异同点是什么”吧!关于这个问题,有的同学可能已经背得滚瓜烂熟了:“进程是操作系统分配资源的单...
    99+
    2023-06-27
  • Node.js中的单线程模型是什么
    这期内容当中小编将会给大家带来有关Node.js中的单线程模型是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、高并发一般来说,高并发的解决方案就是多线程模型,服务...
    99+
    2024-04-02
  • Node.js中的进程与子进程怎么处理
    这篇文章主要讲解了“Node.js中的进程与子进程怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中的进程与子进程怎么处理”吧!进程:process模块process 模...
    99+
    2023-07-04
  • Java中的进程与线程有什么关系
    本篇文章给大家分享的是有关Java中的进程与线程有什么关系,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统...
    99+
    2023-05-31
    java 进程 线程
  • java中多线程的作用是什么
    这篇文章将为大家详细讲解有关java中多线程的作用是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明多线程是指在一个进程中,并发执行了多个线程,每个线程都实现了不同的功能。2、作用(1)在单核C...
    99+
    2023-06-15
  • Java中 join线程的作用是什么
    Java中 join线程的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使调用join()的线程执行完毕后才能执行其它线程,在一定意义上,它可以实现同...
    99+
    2023-06-17
  • Linux中进程与线程的概念以及区别是什么
    本篇文章为大家展示了Linux中进程与线程的概念以及区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题。无论你是初级程序员,还...
    99+
    2023-06-05
  • 什么是进程、线程、协程
    什么是进程? 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操...
    99+
    2023-09-06
    java jvm linux
  • python中强制关闭线程、协程与进程的方法是什么
    这篇“python中强制关闭线程、协程与进程的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中强制关闭...
    99+
    2023-07-05
  • nodejs中process进程的作用是什么
    这期内容当中小编将会给大家带来有关nodejs中process进程的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  进程模块  process模块允许你获得或...
    99+
    2024-04-02
  • Node.js中进程和线程的示例分析
    这篇文章给大家分享的是有关Node.js中进程和线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有...
    99+
    2023-06-15
  • Python中线程同步的作用是什么
    Python中线程同步的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。假如两个线程对象t1和t2都要对数值num=0进行增1运算,那么t1和t2都各对num修改1...
    99+
    2023-06-17
  • java中线程和进程的关系是什么
    这期内容当中小编将会给大家带来有关java中线程和进程的关系是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. ...
    99+
    2023-06-14
  • Node.js中path.resolve与path.join的区别与作用是什么
    本文小编为大家详细介绍“Node.js中path.resolve与path.join的区别与作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中path.resolve与path.join的区别与作用是什么”文章能帮助...
    99+
    2023-07-05
  • bdoesrv进程的作用是什么
    bdoesrv进程的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。进程文件: bdoesrv or bdoesrv.exe进程名称: Bitdefender 8 An...
    99+
    2023-06-07
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作