第21節 Node.js 多進程

Node.js本身是以單線程的模式運行的,但它使用的是事件驅動來處理并發,這樣有助于我們在多核 cpu 的系統上創建多個子進程,從而提高性能。

每個子進程總是帶有三個流對象:child.stdin, child.stdout和child.stderr。他們可能會共享父進程的stdio流,或者也可以是獨立的被導流的流對象。

Node提供了child_process模塊來創建子進程,方法有:

  • exec?- child_process.exec使用子進程執行命令,緩存子進程的輸出,并將子進程的輸出以回調函數參數的形式返回。

  • spawn?- child_process.spawn使用指定的命令行參數創建新進程。

  • fork?- child_process.fork是spawn()的特殊形式,用于在子進程中運行的模塊,如fork('./son.js')相當于spawn('node', ['./son.js']) 。與spawn方法不同的是,fork會在父進程與子進程之間,建立一個通信管道,用于進程之間的通信。


exec() 方法

child_process.exec使用子進程執行命令,緩存子進程的輸出,并將子進程的輸出以回調函數參數的形式返回。

語法如下所示:

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

參數

參數說明如下:

command:?字符串, 將要運行的命令,參數使用空格隔開

options :對象,可以是:

  • cwd,字符串,子進程的當前工作目錄
  • env,對象,環境變量鍵值對
  • encoding,字符串,字符編碼(默認: 'utf8')
  • shell,字符串,將要執行命令的Shell(默認: 在UNIX中為/bin/sh, 在Windows中為cmd.exe, Shell應當能識別-c開關在UNIX中,或/s /c在 Windows中。 在Windows中,命令行解析應當能兼容cmd.exe
  • timeout,數字,超時時間(默認: 0)
  • maxBuffer,數字, 在stdout或stderr中允許存在的最大緩沖(二進制),如果超出那么子進程將會被殺死(默認: 200*1024)
  • killSignal,字符串,結束信號(默認:'SIGTERM')
  • uid,數字,設置用戶進程的ID
  • gid,數字,設置進程組的ID

callback :回調函數,包含三個參數error, stdout和stderr。

exec()方法返回最大的緩沖區,并等待進程結束,一次性返回緩沖區的內容。

實例

讓我們創建兩個js文件support.js和master.js。

support.js文件代碼:

console.log("進程 " + process.argv[2] + " 執行。" );

master.js文件代碼:

const fs = require('fs');
const child_process = require('child_process');for(var i=0; i<3; i++) {var workerProcess = child_process.exec('node support.js '+i,function (error, stdout, stderr) {if (error) {console.log(error.stack);console.log('Error code: '+error.code);console.log('Signal received: '+error.signal);}console.log('stdout: ' + stdout);console.log('stderr: ' + stderr);});workerProcess.on('exit', function (code) {console.log('子進程已退出,退出碼 '+code);});
}

執行以上代碼,輸出結果為:

$ node master.js 
子進程已退出,退出碼 0
stdout: 進程 1 執行。stderr: 
子進程已退出,退出碼 0
stdout: 進程 0 執行。stderr: 
子進程已退出,退出碼 0
stdout: 進程 2 執行。stderr: 

spawn() 方法

child_process.spawn使用指定的命令行參數創建新進程,語法格式如下:

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

參數

參數說明如下:

command:?將要運行的命令

args:?Array字符串參數數組

options Object

  • cwd:String,子進程的當前工作目錄
  • env:Object,環境變量鍵值對
  • stdio:Array|String,子進程的stdio配置
  • detached:Boolean,這個子進程將會變成進程組的領導
  • uid:Number,設置用戶進程的ID
  • gid:Number,設置進程組的ID

spawn()方法返回流 (stdout & stderr),在進程返回大量數據時使用。進程開始執行spawn()時就開始接收響應。

實例

在這個實例中我們創建兩個js文件support.js和master.js。

support.js文件代碼:

console.log("進程 " + process.argv[2] + " 執行。" );

master.js文件代碼:

const fs = require('fs');
const child_process = require('child_process');for(var i=0; i<3; i++) {var workerProcess = child_process.spawn('node', ['support.js', i]);workerProcess.stdout.on('data', function (data) {console.log('stdout: ' + data);});workerProcess.stderr.on('data', function (data) {console.log('stderr: ' + data);});workerProcess.on('close', function (code) {console.log('子進程已退出,退出碼 '+code);});
}

執行以上代碼,輸出結果為:

$ node master.js stdout: 進程 0 執行。子進程已退出,退出碼 0
stdout: 進程 1 執行。子進程已退出,退出碼 0
stdout: 進程 2 執行。子進程已退出,退出碼 0

fork 方法

child_process.fork是spawn()方法的特殊形式,用于創建進程,語法格式如下:

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

參數

參數說明如下:

modulePath: String,將要在子進程中運行的模塊

args: Array,字符串參數數組

options:Object

  • cwd:String,子進程的當前工作目錄
  • env:Object,環境變量鍵值對
  • execPath:String,創建子進程的可執行文件
  • execArgv:Array,子進程的可執行文件的字符串參數數組(默認: process.execArgv)
  • silent:Boolean,如果為true,子進程的stdinstdoutstderr將會被關聯至父進程,否則,它們將會從父進程中繼承。(默認為:false
  • uid:Number,設置用戶進程的ID
  • gid:Number,設置進程組的ID

返回的對象除了擁有ChildProcess實例的所有方法,還有一個內建的通信信道。

實例

讓我們創建兩個js文件support.js和master.js。

support.js文件代碼如下所示:

console.log("進程 " + process.argv[2] + " 執行。" );

master.js文件代碼如下所示:

const fs = require('fs');
const child_process = require('child_process');for(var i=0; i<3; i++) {var worker_process = child_process.fork("support.js", [i]);	worker_process.on('close', function (code) {console.log('子進程已退出,退出碼 ' + code);});
}

執行以上代碼,輸出結果為:

$ node master.js 
進程 0 執行。
子進程已退出,退出碼 0
進程 1 執行。
子進程已退出,退出碼 0
進程 2 執行。
子進程已退出,退出碼 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83673.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【走進Golang】測試SDK環境搭建成功,配置path環境變量

[1]進入控制命令臺&#xff1a;win R -->cmd [2]證明SDK環境成功 1.此電腦 2.高級系統設置 3.環境變量 4.點擊環境變量&#xff0c;進入找到 path&#xff0c;點擊編輯 5.進入編輯,找到對應目錄&#xff0c;配置成功 添加完成后&#xff0c;點擊確定&#xff0c;確定&#…

LlamaIndex 工作流 并發執行

除了循環和分支之外&#xff0c;工作流還可以并發地執行步驟。當你有多個可以相互獨立運行的步驟&#xff0c;并且這些步驟中包含需要等待的耗時操作時&#xff0c;這種并發執行的方式就非常有用&#xff0c;因為它允許其他步驟并行運行。 觸發多個事件 到目前為止&#xff0…

精粹匯總:大廠編程規范(持續更新)

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄 1 引言2 并發控制 (Concurrency Control)3 事務控…

curl 檢查重定向的命令總結

查看是否發生了重定向&#xff1a; curl -I http://yourdomain.com跟蹤整個重定向鏈&#xff1a; curl -IL http://yourdomain.com禁止跳轉&#xff0c;檢查是否返回 301/302&#xff1a; curl -I --max-redirs 0 http://yourdomain.com如果你只想看跳沒跳 HTTPS&#xff0c…

STM32 Bootloader:使用文件頭加載并啟動應用程序

文章目錄 STM32 Bootloader&#xff1a;使用文件頭加載并啟動應用程序的完整解析一、系統整體流程二、鏡像頭結構 image\_header\_t三、Bootloader 主函數流程1. 初始化 UART2. 調用啟動函數3. 拷貝 APP 并跳轉啟動 四、跳轉執行 APP 的實現五、總結與擴展思路 明白了&#xff…

無外接物理顯示器的Ubuntu系統的遠程桌面連接(升級版)

文章目錄 操作步驟實踐截圖配置 Xorg 的虛擬顯示界面(升級版) 操作步驟 “遠程連接”,在設置里直接打開就可以.進行配置就行. 1.配置 GRUB 以支持無顯示器啟動 sudo nano /etc/default/grub (里面有一行改為: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash videovesa:off vi…

ACCU-100安科瑞協調控制器:精準調控光伏逆變器

產品概述 ACCU-100微電網協調控制器是一款應用于微電網、分布式發電、儲能等領域的智能協調控制器。它能接入光伏系統、風力發電、儲能系統以及充電樁等設備&#xff0c;通過對微電網系統進行數據采集與分析&#xff0c;實時監控各類設備的運行狀態和健康狀況。在此基礎上&…

長春光博會 | 麒麟信安:構建工業數字化安全基座,賦能智能制造轉型升級

6月10日-13日&#xff0c;2025長春國際光電博覽會Light國際會議&#xff08;簡稱長春光博會&#xff09;在長春東北亞國際博覽中心盛大舉行&#xff0c;吉林省委書記黃強出席并宣布開幕&#xff0c;省委副書記、省長胡玉亭致辭。本屆大會聚焦光電信息領域的前沿技術和最新產品&…

書寫時垂直筆畫比水平筆畫表現更好的心理機制分析

你有寫字的時候總是垂直方向筆畫好寫&#xff0c;水平方向的筆畫不好寫的情況存在嗎&#xff1f; 書寫時垂直筆畫比水平筆畫表現更好的心理機制分析 從人類認知和行為模式的角度來理解這種現象。以下是深度心理分析&#xff1a; 核心心理動因 重力知覺內化&#xff1a; 垂直…

SpringAI使用總結

SpringAI使用總結 基本使用ChatModel和ChatClient簡單對話流式輸出預設角色prompt&#xff08;提示詞&#xff09;function call&#xff08;工具調用&#xff09;參考 基本使用 ChatModel和ChatClient SpringAi支持非常多的模型&#xff0c;為了統一處理&#xff0c;SpringA…

歷史交易數據漲跌分級

歷史交易數據漲跌分級 # encoding:utf-8 import sys,traceback from loguru import loggersys.path.append("..") from QhSpiderTool import QhDorpFiled from QhCsvMode import *def QhZhangDieFenJi(QhDfData,QhFangFa"A"):"""歷史交易數…

Kafka入門4.0.0版本(基于Java、SpringBoot操作)

Kafka入門4.0.0版本&#xff08;基于Java、SpringBoot操作&#xff09; 一、kafka概述 Kafka最初是由LinkedIn公司開發的&#xff0c;是一個高可靠、高吞吐量、低延遲的分布式發布訂閱消息系統&#xff0c;它使用Scala語言編寫&#xff0c;并于2010年被貢獻給了Apache基金會&…

react react-router-dom中獲取自定義參數v6.4版本之后

路由配置, AutnToken 組件作為權限、登錄管理 import { createBrowserRouter, Navigate } from react-router-dom; import Layout from /layout/index; import Login from /pages/login; import Page404 from /pages/404;import AutnToken from /components/authToken; import…

AI中的Prompt

1. System 作用&#xff1a;設定 AI 的“角色設定”和“行為準則”。 內容&#xff1a;通常是描述 LLM 的身份、語氣、行為范圍、約束規則。 類似&#xff1a;在大語言模型中是最優先被考慮的提示。 示例&#xff1a; 你是一個專業的商品評價分析助手&#xff0c;請根據用戶…

從人工到智能:IACheck如何重構檢測報告審核工作流?

從人工到智能&#xff1a;IACheck如何重構檢測報告審核工作流&#xff1f; 在當今AI技術迅猛發展的時代&#xff0c;各行各業正經歷從“人工驅動”到“智能驅動”的根本性變革。檢測認證&#xff08;TIC&#xff09;行業作為關乎質量與安全的重要支柱&#xff0c;也不例外。在…

React事件處理:如何給按鈕綁定onClick點擊事件?

系列回顧&#xff1a; 在前幾篇文章中&#xff0c;我們已經學會了如何使用 State 管理組件的內部數據&#xff0c;以及如何通過 Props 實現父子組件之間的通信。我們的組件現在已經有了“數據”和“外觀”。但是&#xff0c;它還像一個只能看的“模型”&#xff0c;無法與用戶進…

【機器學習|學習筆記】粒子群優化(Particle Swarm Optimization, PSO)詳解,附代碼。

【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 文章目錄 【機器學習|學習筆記】粒…

深度剖析:AI 社媒矩陣營銷工具,如何高效獲客?

在社交媒體營銷領域&#xff0c;競爭日益激烈&#xff0c;傳統的社媒矩陣運營方式面臨諸多挑戰。而 AI 社媒矩陣營銷工具的出現&#xff0c;正以前所未有的方式重構社媒矩陣的底層架構&#xff0c;為營銷人員帶來了全新的機遇與變革。接下來&#xff0c;我們將從技術破局、實戰…

Spring XML 常用命名空間配置

Spring XML 常用命名空間配置 下面是一個綜合性的Spring XML配置樣例&#xff0c;展示了各種常用命名空間的使用方式&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&quo…

UE5場景漫游——開始界面及關卡跳轉

UE中實現UMG游戲界面搭建及藍圖控制&#xff0c;點擊游戲界面中的按鈕實現關卡的跳轉效果。 一、游戲界面顯示。1.創建UMG&#xff0c;2.搭建UI。3.關卡藍圖控制顯示 二、點擊按鈕之后實現關卡跳轉