• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    在Node.js中子進程有哪些應用場景

    來源:懂視網 責編:小采 時間:2020-11-27 19:38:53
    文檔

    在Node.js中子進程有哪些應用場景

    在Node.js中子進程有哪些應用場景:這篇文章主要介紹了淺談Node.js 子進程與應用場景,現在分享給大家,也給大家做個參考。背景由于ons(阿里云 RocketMQ 包)基于 C艸 封裝而來,不支持單一進程內實例化多個生產者與消費者,為了解決這一問題,使用了 Node.js 子進程。在使用的過程中碰到的坑
    推薦度:
    導讀在Node.js中子進程有哪些應用場景:這篇文章主要介紹了淺談Node.js 子進程與應用場景,現在分享給大家,也給大家做個參考。背景由于ons(阿里云 RocketMQ 包)基于 C艸 封裝而來,不支持單一進程內實例化多個生產者與消費者,為了解決這一問題,使用了 Node.js 子進程。在使用的過程中碰到的坑

    這篇文章主要介紹了淺談Node.js 子進程與應用場景,現在分享給大家,也給大家做個參考。

    背景

    由于ons(阿里云 RocketMQ 包)基于 C艸 封裝而來,不支持單一進程內實例化多個生產者與消費者,為了解決這一問題,使用了 Node.js 子進程。

    在使用的過程中碰到的坑

    發布:進程管理關閉主進程后,子進程變為操作系統進程(pid 為 1)

    幾種解決方案

    將子進程看做獨立運行的進程,記錄 pid,發布時進程管理關閉主進程同時關閉子進程

    主進程監聽關閉事件,主動關閉從屬于自己的子進程

    子進程種類

    1. spawn:執行命令

    2. exec:執行命令(新建 shell)

    3. execFile:執行文件

    4. fork:執行文件

    子進程常用事件

    1. exit

    2. close

    3. error

    4. message

    close 與 exit 是有區別的,close 是在數據流關閉時觸發的事件,exit 是在子進程退出時觸發的事件。因為多個子進程可以共享同一個數據流,所以當某個子進程 exit 時不一定會觸發 close 事件,因為這個時候還存在其他子進程在使用數據流。

    子進程數據流

    1. stdin

    2. stdout

    3. stderr

    因為是以主進程為出發點,所以子進程的數據流與常規理解的數據流方向相反,stdin:寫入流,stdout、stderr:讀取流。

    spawn

    spawn(command[, args][, options])

    執行一條命令,通過 data 數據流返回各種執行結果。

    基礎使用

    const { spawn } = require('child_process');
    
    const child = spawn('find', [ '.', '-type', 'f' ]);
    child.stdout.on('data', (data) => {
     console.log(`child stdout:\n${data}`);
    });
    
    child.stderr.on('data', (data) => {
     console.error(`child stderr:\n${data}`);
    });
    
    child.on('exit', (code, signal) => {
     console.log(`child process exit with: code $[code], signal: ${signal}`);
    });

    常用參數

    {
     cwd: String,
     env: Object,
     stdio: Array | String,
     detached: Boolean,
     shell: Boolean,
     uid: Number,
     gid: Number
    }

    重點說明下 detached 屬性,detached 設置為 true 是為子進程獨立運行做準備。子進程的具體行為與操作系統相關,不同系統表現不同,Windows 系統子進程會擁有自己的控制臺窗口,POSIX 系統子進程會成為新進程組與會話負責人。

    這個時候子進程還沒有完全獨立,子進程的運行結果會展示在主進程設置的數據流上,并且主進程退出會影響子進程運行。當 stdio 設置為 ignore 并調用 child.unref(); 子進程開始真正獨立運行,主進程可獨立退出。

    exec

    exec(command[, options][, callback])

    執行一條命令,通過回調參數返回結果,指令未執行完時會緩存部分結果到系統內存。

    const { exec } = require('child_process');
    
    exec('find . -type f | wc -l', (err, stdout, stderr) => {
     if (err) {
     console.error(`exec error: ${err}`);
     return;
     }
    
     console.log(`Number of files ${stdout}`);
    });

    兩全其美 —— spawn 代替 exec

    由于 exec 的結果是一次性返回,在返回前是緩存在內存中的,所以在執行的 shell 命令輸出過大時,使用 exec 執行命令的方式就無法按期望完成我們的工作,這個時候可以使用 spawn 代替 exec 執行 shell 命令。

    const { spawn } = require('child_process');
    
    const child = spawn('find . -type f | wc -l', {
     stdio: 'inherit',
     shell: true
    });
    
    child.stdout.on('data', (data) => {
     console.log(`child stdout:\n${data}`);
    });
    
    child.stderr.on('data', (data) => {
     console.error(`child stderr:\n${data}`);
    });
    
    child.on('exit', (code, signal) => {
     console.log(`child process exit with: code $[code], signal: ${signal}`);
    });

    execFile

    child_process.execFile(file[, args][, options][, callback])

    執行一個文件

    與 exec 功能基本相同,不同之處在于執行給定路徑的一個腳本文件,并且是直接創建一個新的進程,而不是創建一個 shell 環境再去運行腳本,相對更輕量級更高效。但是在 Windows 系統中如 .cmd 、 .bat 等文件無法直接運行,這是 execFile 就無法工作,可以使用 spawn、exec 代替。

    fork

    child_process.fork(modulePath[, args][, options])

    執行一個 Node.js 文件

    // parent.js
    
    const { fork } = require('child_process');
    
    const child = fork('child.js');
    
    child.on('message', (msg) => {
     console.log('Message from child', msg);
    });
    
    child.send({ hello: 'world' });
    // child.js
    
    process.on('message', (msg) => {
     console.log('Message from parent:', msg);
    });
    
    let counter = 0;
    
    setInterval(() => {
     process.send({ counter: counter++ });
    }, 3000);

    fork 實際是 spawn 的一種特殊形式,固定 spawn Node.js 進程,并且在主子進程間建立了通信通道,讓主子進程可以使用 process 模塊基于事件進行通信。

    子進程使用場景

    1. 計算密集型系統

    2. 前端構建工具利用多核 CPU 并行計算,提升構建效率

    3. 進程管理工具,如:PM2 中部分功能

    上面是我整理給大家的,希望今后會對大家有幫助。

    相關文章:

    在vue.js中有關vue-fontawesome使用

    使用JS添加元素新節點

    有關Express中log4js實際用法

    在vue中如何引用阿里字體圖標的方法

    通過Node.js使用MySQL連接池

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    在Node.js中子進程有哪些應用場景

    在Node.js中子進程有哪些應用場景:這篇文章主要介紹了淺談Node.js 子進程與應用場景,現在分享給大家,也給大家做個參考。背景由于ons(阿里云 RocketMQ 包)基于 C艸 封裝而來,不支持單一進程內實例化多個生產者與消費者,為了解決這一問題,使用了 Node.js 子進程。在使用的過程中碰到的坑
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 黑人精品videos亚洲人| 亚洲?V无码成人精品区日韩| 久久精品国产精品亜洲毛片| 亚洲精品国产成人专区| 国产精品久久久久久一区二区三区| jizzjizz国产精品久久| 国产精品成人免费福利| 亚洲欧美国产精品专区久久| 无码国产精品一区二区免费3p| 中文精品99久久国产 | 精品少妇无码AV无码专区| 久久免费的精品国产V∧| 嫖妓丰满肥熟妇在线精品| 精品久久久久久久中文字幕| 四虎国产精品免费久久| 国产精品青草视频免费播放| 精品欧美一区二区三区久久久| 久久最新精品国产| 日韩视频中文字幕精品偷拍| 国产精品无码v在线观看| 中国国产精品| 亚洲精品久久久www| 538国产精品一区二区在线| 日韩精品真人荷官无码| 亚洲一区二区精品视频| 欧美精品综合视频一区二区| 无码国产精品一区二区免费vr | 精品久久久久久中文字幕人妻最新| 亚洲精品国产日韩无码AV永久免费网| 久久国产成人亚洲精品影院 | 久久福利青草精品资源站| 国产99re在线观看只有精品| 国产成人精品久久综合| 亚洲高清国产拍精品26U| 欧美大片日韩精品| AV无码精品一区二区三区| 国产精品国产三级国产av品爱网| 国产精品人人做人人爽| 国产精品麻豆入口| 精品国产三级a乌鸦在线观看| 国内少妇偷人精品视频免费 |