進程和線程
“進程” 是計算機系統進行資源分配和調度的基本單位,我們可以理解為計算機每開啟一個任務就會創建至少一個進程來處理,有時會創建多個,如 Chrome 瀏覽器的選項卡,其目的是為了防止一個進程掛掉而應用停止工作,而 “線程” 是程序執行流的最小單元,NodeJS 默認是單進程、單線程的,我們將這個進程稱為主進程,也可以通過 child_process 模塊創建子進程實現多進程,我們稱這些子進程為 “工作進程”,并且歸主進程管理,進程之間默認是不能通信的,且所有子進程執行任務都是異步的。
spawn 實現多進程
1、spawn 創建子進程
在 NodeJS 中執行一個 JS 文件,如果想在這個文件中再同時(異步)執行另一個 JS 文件,可以使用 child_process 模塊中的 spawn 來實現,spawn 可以幫助我們創建一個子進程,用法如下。
// 文件:process.jsconst { spawn } = require("child_process");const path = require("path");// 創建子進程let child = spawn("node", ["sub_process.js", "--port", "3000"], { cwd: path.join(__dirname, "test") // 指定子進程的當前工作目錄});// 出現錯誤觸發child.on("error", err => console.log(err));// 子進程退出觸發child.on("exit", () => console.log("exit"));// 子進程關閉觸發child.on("close", () => console.log("close"));// exit// closespawn 方法可以幫助我們創建一個子進程,這個子進程就是方法的返回值,spawn 接收以下幾個參數:
command:要運行的命令; args:類型為數組,數組內第一項為文件名,后面項依次為執行文件的命令參數和值; options:選項,類型為對象,用于指定子進程的當前工作目錄和主進程、子進程的通信規則等,具體可查看 官方文檔。error 事件在子進程出錯時觸發,exit 事件在子進程退出時觸發,close 事件在子進程關閉后觸發,在子進程任務結束后 exit 一定會觸發,close 不一定觸發。
// 文件:~test/sub_process.js// 打印子進程執行 sub_process.js 文件的參數console.log(process.argv);
通過上面代碼打印了子進程執行時的參數,但是我們發現主進程窗口并沒有打印,我們希望的是子進程的信息可以反饋給主進程,要實現通信需要在創建子進程時在第三個參數 options 中配置 stdio 屬性定義。
2、spawn 定義輸入、輸出
// 文件:process.jsconst { spawn } = require("child_process");const path = require("path");// 創建子進程let child = spawn("node", ["sub_process.js", "--port", "3000"], { cwd: path.join(__dirname, "test") // 指定子進程的當前工作目錄 // stdin: [process.stdin, process.stdout, process.stderr] stdio: [0, 1, 2] // 配置標準輸入、標準輸出、錯誤輸出});// C:/Program Files/nodejs/node.exe,g:/process/test/sub_process.js,--port,3000
新聞熱點
疑難解答
圖片精選