91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js進程管理之子進程實例分析

發布時間:2022-07-06 13:47:53 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇“Node.js進程管理之子進程實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Node.js進程管理之子進程實例分析”文章吧。

一、理論

Node.js是單線程的,對于現在普遍是多處理器的機器是一種浪費,怎么能利用起來呢?于是child_process模塊出現了。child_process模塊可以在其他進程上產生、派生,并執行工作。

child_process模塊提供了一個ChildProcess的新類,它可以作為從父進程訪問子進程的表示形式。Process模塊也是ChildProcess對象。當你從父模塊訪問process時,它是父ChildProcess對象,當你從子進程訪問Process是,它是ChildProcess對象

了解一個對象無外乎事件、方法、屬性。ChildProcess也是一樣。下面列出一些常用的事件、方法和屬性。

事件:

message:當ChildProcess對象調用send()方法來發送數據時觸發。

error:在工作進程中出現錯誤時發出。該處理程序接收一個錯誤對象作為唯一的參數。

exit:當工作進程結束時發出。該處理程序接收兩個參數,code,signal.

close:當工作進程的所有stdio流都已經終止的時候發出。與exit不同的是,因為多個進程可以共享相同的stdio流。

disconnect:當disconnect()在一個工作進程上被調用時發出。

方法:

kill([signal]):導致操作系統發送一個kill信號給子進程。默認是SIGTERM.

send(message,[sendHandle]):將消息發送到句柄。消息可是字符串或對象。sendhandle可以把TCP Server或socket對象發送到客戶端。這允許客戶端進程共享相同的端口和地址。

disconnect():關閉父進程與子進程之間的進程通信(或IPC)通道,并把父進程和子進程的連接標志都設置為false。

屬性:

stdin:輸入Writable流。

stdout:標準輸出Readable流。

strerr:用于輸出錯誤的標準輸出Readable流。

pid:進程的ID。

connected:一個布爾值。在disconnect()被調用后,它被設置為false,當是false時,就不能將消息發送給子進程。

二、實踐

1.exec()在另一進程執行一個系統命令

exec()函數在一個子shell中執行系統命令。幾乎可以執行能從控制臺提示符下執行的任何東西,如二進制可執行文件、shell腳本、Python腳本或批處理文件。

exec(command,[options],callback)函數返回一個ChildProcess對象

command:字符串,指定在子shell中執行的命令。

options:對象,指定執行命令時使用的設置。選項如下:

  • cwd:指定子進程執行的當前工作目錄

  • env:一個對象,指定property:value作為環境的鍵/值對

  • encoding:指定存儲命令的輸出時輸出緩沖區使用的編碼

  • maxBuffer:指定stdout、stderror輸出緩沖區的大小。默認200*1024.

  • timeout:指定父進程在殺掉子進程之前,如果子進程未完成等待的毫秒數。默認0

  • killSignal:指定終止子進程時使用的kill信號。默認SIGTERM。

callback:接收error、stdout、stderr3個參數。

var childProcess = require('child_process');
var options = {maxBuffer:100*1024, encoding:'utf8', timeout:5000};
var child = childProcess.exec('dir /B', options, 
                              function (error, stdout, stderr) {
  if (error) {
    console.log(error.stack);
    console.log('Error Code: '+error.code);
    console.log('Error Signal: '+error.signal);
  }
  console.log('Results: \n' + stdout);
  if (stderr.length){
    console.log('Errors: ' + stderr);
  }
});
child.on('exit', function (code) {
  console.log('Completed with code: '+code);
});

輸出結果:

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe child_process_exec.js
Completed with code: 0
Results: 
chef.js
child_fork.js
child_process_exec.js
child_process_exec_file.js
child_process_spawn.js
cluster_client.js
cluster_server.js
cluster_worker.js
file.txt
process_info.js


Process finished with exit code 0

2.execFile()在另一個進程上執行一個可執行文件

它與exec()相似,不同的是execFile()沒有使用子shell,執行的命令必須是一個二進制可執行文件Linux的shell腳本和Windows的批處理文件不能使用ecexFile().

execFile(file,args,options,callback)也是返回一個ChildProcess。

file:字符串,執行要執行的可執行文件的路徑。

args:數組,指定傳遞給可執行文件的命令行參數。

options:參考exec()的。

callback:參考exec().

var childProcess = require('child_process');
var options = {maxBuffer:100*1024, encoding:'UTF-16', timeout:5000};
var child = childProcess.execFile('ping.exe', ['-n', '1', 'baidu.com'],
                                  options, function (error, stdout, stderr) {
  if (error) {
    console.log(error.stack);
    console.log('Error Code: '+error.code);
    console.log('Error Signal: '+error.signal);
  }
  console.log('Results: \n' + stdout.toString());
  if (stderr.length){
    console.log('Errors: ' + stderr.toString());
  }
});
child.on('exit', function (code) {
  console.log('Child completed with code: '+code);
});

3.spawn()在另一個Node.js實例中產生一個進程

spawn(cmd,[args],[options])函數產生一個進程,連接它們之間的stdio、stdout、stderr的管道,然后在新的線程中使用spawn()執行文件。它和上面兩個的主要區別是產生的進程中的stdin可以進行配置,并且stdout、stderr都是父進程中的Readable流。這意味著exec()、execFile()必須先執行完成,才能讀取緩沖區輸出,但一旦一個spawn()進程的輸出數據已被寫入就可以讀取它(這個可以從它們3個的輸出結果的順序可以看出,上面兩個都是先執行exit事件,而spawn()exit處理是在后面)。

cmd、args和上面兩個的一樣。options也可以設置cwd、env,還可以設置detached、stdio。

detached:布爾值,true時使子進程成為新進程組的組長,即使父進程退出,也會繼續,可以使用child_unref()使得父進程退出之前不等待子進程

stdio:定義子進程stdio配置([stdin,stdout,stderr]).默認[0,1,2].此字符串定義每個輸入輸出流的配置。

var spawn = require('child_process').spawn;
var options = {
    env: {user:'brad'},
    detached:false,
    stdio: ['pipe','pipe','pipe']
};
var child = spawn('netstat', ['-e']);
child.stdout.on('data', function(data) {
  console.log(data.toString());
});
child.stderr.on('data', function(data) {
  console.log(data.toString());
});
child.on('exit', function(code) {
  console.log('Child exited with code', code);
});

4.實現子派生

Node.js提供了另外一種進程產生方式——派生。它主要是執行在一個單獨的處理器上運行另外一個V8引擎實例中的Node.js模塊代碼。可以用派生來并行運行多個服務。不過這需要時間來運轉V8的一個新實例,每個實例需要大約10M的內存,所以應該把派生的進程設計為存活期更長的,不需要大量派生的進程。與spawn不同的是,它不能為子進程配置stdio。可以使用ChildProcess對象中的send()機制在父進程與子進程間通信。

fork(modulePath,[args],[options])對象也是返回一個ChildProcess對象。

modulePath:字符串,指定被新的Node.js實例啟動的JavaScript文件路徑。

args:數組,指定傳遞給node命令的命令行參數。

options:參數對象,指定執行命令時使用的設置。

cwd、env上面有。

encoding:指定數據寫入輸出流時和穿越send()IPC機制時使用的編碼

execPath:指定用于創建產生Node.js進程的可執行文件。

silent:一個布爾值,true時將導致派生的進程中的stdout和stderr不與父進程相關聯,默認false。

Child.send()父進程向子進程發送消息,Process.send()是子進程向父進程發送消息。

var child_process = require('child_process');
var options = {
    env:{user:'Brad'},
    encoding:'utf8'
};
function makeChild(){
  var child = child_process.fork('chef.js', [], options);
  child.on('message', function(message) {
    console.log('Served: ' + message);
  });
  return child;
}
function sendCommand(child, command){
  console.log("Requesting: " + command);
  child.send({cmd:command});
}
var child1 = makeChild();
var child2 = makeChild();
var child3 = makeChild();
sendCommand(child1, "makeBreakfast");
sendCommand(child2, "makeLunch");
sendCommand(child3, "makeDinner");
process.on('message', function(message, parent) {
  var meal = {};
  switch (message.cmd){
    case 'makeBreakfast':
      meal = ["ham", "eggs", "toast"];
      break;
    case 'makeLunch':
      meal = ["burger", "fries", "shake"];
      break;
    case 'makeDinner':
      meal = ["soup", "salad", "steak"];
      break;
  }
  process.send(meal);
});

輸出結果:

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe child_fork.js
Requesting: makeBreakfast
Requesting: makeLunch
Requesting: makeDinner
Served: ham,eggs,toast
Served: burger,fries,shake
Served: soup,salad,steak

上面的代碼是在主進程中創建3個子進程,父進程給子進程發消息,子進程接收并給父進程發消息。

以上就是關于“Node.js進程管理之子進程實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆尧县| 澎湖县| 普兰店市| 八宿县| 隆子县| 芦溪县| 清远市| 利津县| 辽阳县| 临猗县| 普安县| 綦江县| 文水县| 建水县| 陈巴尔虎旗| 兴安盟| 韶关市| 清原| 寿宁县| 兴海县| 资源县| 定州市| 正蓝旗| 泰宁县| 长岛县| 望奎县| 闸北区| 肇东市| 温泉县| 赞皇县| 特克斯县| 卢龙县| 普兰县| 张家界市| 阿鲁科尔沁旗| 新安县| 阜城县| 柳江县| 舟山市| 巴中市| 三河市|