最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js進(jìn)程管理之子進(jìn)程詳解

 更新時(shí)間:2022年07月06日 11:53:38   作者:社會(huì)主義接班人  
本文詳細(xì)講解了Node.js進(jìn)程管理之子進(jìn)程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、理論

之前看多進(jìn)程這一章節(jié)時(shí)發(fā)現(xiàn)這塊東西挺多,寫(xiě)Process模塊的時(shí)候也有提到,今天下午午休醒來(lái)靜下心來(lái)好好的看了一遍,發(fā)現(xiàn)也不是太難理解。

Node.js是單線程的,對(duì)于現(xiàn)在普遍是多處理器的機(jī)器是一種浪費(fèi),怎么能利用起來(lái)呢?于是child_process模塊出現(xiàn)了。child_process模塊可以在其他進(jìn)程上產(chǎn)生、派生,并執(zhí)行工作。

child_process模塊提供了一個(gè)ChildProcess的新類,它可以作為從父進(jìn)程訪問(wèn)子進(jìn)程的表示形式。Process模塊也是ChildProcess對(duì)象。當(dāng)你從父模塊訪問(wèn)process時(shí),它是父ChildProcess對(duì)象,當(dāng)你從子進(jìn)程訪問(wèn)Process是,它是ChildProcess對(duì)象

了解一個(gè)對(duì)象無(wú)外乎事件、方法、屬性。ChildProcess也是一樣。下面列出一些常用的事件、方法和屬性。

事件:

message:當(dāng)ChildProcess對(duì)象調(diào)用send()方法來(lái)發(fā)送數(shù)據(jù)時(shí)觸發(fā)。

error:在工作進(jìn)程中出現(xiàn)錯(cuò)誤時(shí)發(fā)出。該處理程序接收一個(gè)錯(cuò)誤對(duì)象作為唯一的參數(shù)。

exit:當(dāng)工作進(jìn)程結(jié)束時(shí)發(fā)出。該處理程序接收兩個(gè)參數(shù),code,signal.

close:當(dāng)工作進(jìn)程的所有stdio流都已經(jīng)終止的時(shí)候發(fā)出。與exit不同的是,因?yàn)槎鄠€(gè)進(jìn)程可以共享相同的stdio流。

disconnect:當(dāng)disconnect()在一個(gè)工作進(jìn)程上被調(diào)用時(shí)發(fā)出。

方法:

kill([signal]):導(dǎo)致操作系統(tǒng)發(fā)送一個(gè)kill信號(hào)給子進(jìn)程。默認(rèn)是SIGTERM.

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

disconnect():關(guān)閉父進(jìn)程與子進(jìn)程之間的進(jìn)程通信(或IPC)通道,并把父進(jìn)程和子進(jìn)程的連接標(biāo)志都設(shè)置為false。

屬性:

stdin:輸入Writable流。

stdout:標(biāo)準(zhǔn)輸出Readable流。

strerr:用于輸出錯(cuò)誤的標(biāo)準(zhǔn)輸出Readable流。

pid:進(jìn)程的ID。

connected:一個(gè)布爾值。在disconnect()被調(diào)用后,它被設(shè)置為false,當(dāng)是false時(shí),就不能將消息發(fā)送給子進(jìn)程。

二、實(shí)踐

1.exec()在另一進(jìn)程執(zhí)行一個(gè)系統(tǒng)命令

exec()函數(shù)在一個(gè)子shell中執(zhí)行系統(tǒng)命令。幾乎可以執(zhí)行能從控制臺(tái)提示符下執(zhí)行的任何東西,如二進(jìn)制可執(zhí)行文件、shell腳本、Python腳本或批處理文件。

exec(command,[options],callback)函數(shù)返回一個(gè)ChildProcess對(duì)象

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

options:對(duì)象,指定執(zhí)行命令時(shí)使用的設(shè)置。選項(xiàng)如下:

  • cwd:指定子進(jìn)程執(zhí)行的當(dāng)前工作目錄
  • env:一個(gè)對(duì)象,指定property:value作為環(huán)境的鍵/值對(duì)
  • encoding:指定存儲(chǔ)命令的輸出時(shí)輸出緩沖區(qū)使用的編碼
  • maxBuffer:指定stdout、stderror輸出緩沖區(qū)的大小。默認(rèn)200*1024.
  • timeout:指定父進(jìn)程在殺掉子進(jìn)程之前,如果子進(jìn)程未完成等待的毫秒數(shù)。默認(rèn)0
  • killSignal:指定終止子進(jìn)程時(shí)使用的kill信號(hào)。默認(rèn)SIGTERM。

callback:接收error、stdout、stderr3個(gè)參數(shù)。

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);
});

輸出結(jié)果:

"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()在另一個(gè)進(jìn)程上執(zhí)行一個(gè)可執(zhí)行文件

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

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

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

args:數(shù)組,指定傳遞給可執(zhí)行文件的命令行參數(shù)。

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()在另一個(gè)Node.js實(shí)例中產(chǎn)生一個(gè)進(jìn)程

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

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

detached:布爾值,true時(shí)使子進(jìn)程成為新進(jìn)程組的組長(zhǎng),即使父進(jìn)程退出,也會(huì)繼續(xù),可以使用child_unref()使得父進(jìn)程退出之前不等待子進(jìn)程

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

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.實(shí)現(xiàn)子派生

Node.js提供了另外一種進(jìn)程產(chǎn)生方式——派生。它主要是執(zhí)行在一個(gè)單獨(dú)的處理器上運(yùn)行另外一個(gè)V8引擎實(shí)例中的Node.js模塊代碼??梢杂门缮鷣?lái)并行運(yùn)行多個(gè)服務(wù)。不過(guò)這需要時(shí)間來(lái)運(yùn)轉(zhuǎn)V8的一個(gè)新實(shí)例,每個(gè)實(shí)例需要大約10M的內(nèi)存,所以應(yīng)該把派生的進(jìn)程設(shè)計(jì)為存活期更長(zhǎng)的,不需要大量派生的進(jìn)程。與spawn不同的是,它不能為子進(jìn)程配置stdio??梢允褂肅hildProcess對(duì)象中的send()機(jī)制在父進(jìn)程與子進(jìn)程間通信。

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

modulePath:字符串,指定被新的Node.js實(shí)例啟動(dòng)的JavaScript文件路徑。

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

options:參數(shù)對(duì)象,指定執(zhí)行命令時(shí)使用的設(shè)置。

cwd、env上面有。

encoding:指定數(shù)據(jù)寫(xiě)入輸出流時(shí)和穿越send()IPC機(jī)制時(shí)使用的編碼

execPath:指定用于創(chuàng)建產(chǎn)生Node.js進(jìn)程的可執(zhí)行文件。

silent:一個(gè)布爾值,true時(shí)將導(dǎo)致派生的進(jìn)程中的stdout和stderr不與父進(jìn)程相關(guān)聯(lián),默認(rèn)false。

Child.send()父進(jìn)程向子進(jìn)程發(fā)送消息,Process.send()是子進(jìn)程向父進(jìn)程發(fā)送消息。

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);
});

輸出結(jié)果:

"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

上面的代碼是在主進(jìn)程中創(chuàng)建3個(gè)子進(jìn)程,父進(jìn)程給子進(jìn)程發(fā)消息,子進(jìn)程接收并給父進(jìn)程發(fā)消息。

到此這篇關(guān)于Node.js進(jìn)程管理之子進(jìn)程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • windows 下安裝nodejs 環(huán)境變量設(shè)置

    windows 下安裝nodejs 環(huán)境變量設(shè)置

    windows 下安裝nodejs 了,也安裝了npm, 但是有時(shí)候切不能直接用request(‘ws’)這一類的東西.我覺(jué)得是確實(shí)環(huán)境變量或其他設(shè)置有問(wèn)題,能否給個(gè)完整的設(shè)置方案:
    2017-02-02
  • 淺析nodejs實(shí)現(xiàn)Websocket的數(shù)據(jù)接收與發(fā)送

    淺析nodejs實(shí)現(xiàn)Websocket的數(shù)據(jù)接收與發(fā)送

    WebSocket是HTML5開(kāi)始提供的一種瀏覽器與服務(wù)器間進(jìn)行全雙工通訊的網(wǎng)絡(luò)技術(shù),本文給大家介紹nodejs實(shí)現(xiàn)websocket的數(shù)據(jù)庫(kù)接收與發(fā)送,小伙伴們一起學(xué)習(xí)吧
    2015-11-11
  • node.js中的fs.realpath方法使用說(shuō)明

    node.js中的fs.realpath方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.realpath方法使用說(shuō)明,本文介紹了fs.realpath的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解nodejs 文本操作模塊-fs模塊(五)

    詳解nodejs 文本操作模塊-fs模塊(五)

    本篇文章主要介紹了nodejs 文本操作模塊-fs模塊(五),這里再說(shuō)最后一個(gè)我看來(lái)很重要的方法,監(jiān)聽(tīng)文件或者目錄的的方法watchFile。有興趣的可以了解一下。
    2016-12-12
  • 用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法

    用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法

    本篇文章主要介紹了用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 搞懂什么是Node.js原來(lái)這么簡(jiǎn)單

    搞懂什么是Node.js原來(lái)這么簡(jiǎn)單

    這篇文章主要介紹了Node.js的概念和基本原理,對(duì)Node.js感興趣的同學(xué),一定要看一下
    2021-04-04
  • Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子)

    Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子)

    這篇文章主要介紹了Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子),需要的朋友可以參考下
    2017-02-02
  • node文件批量重命名的方法示例

    node文件批量重命名的方法示例

    本篇文章主要介紹了node文件批量重命名的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過(guò)程

    npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)遇到同樣問(wèn)題的同學(xué)具有一定的參考性,需要的朋友可以參考下
    2023-04-04
  • 如何寫(xiě)Node.JS版本小游戲

    如何寫(xiě)Node.JS版本小游戲

    JavaScript的出現(xiàn)催動(dòng)了前端開(kāi)發(fā)的萌芽,前后端分離促進(jìn)了Vue、React等開(kāi)發(fā)框架的發(fā)展,Weex、React-Native等的演變賦予了并存多端開(kāi)發(fā)的能力,而Node.JS的面世無(wú)疑是推動(dòng)了Web全棧開(kāi)發(fā)的步伐。
    2021-05-05

最新評(píng)論

城市| 资中县| 利津县| 泽普县| 威信县| 兴仁县| 旅游| 依兰县| 通州市| 永康市| 克拉玛依市| 普定县| 平顶山市| 永吉县| 宝鸡市| 满洲里市| 墨竹工卡县| 闻喜县| 吉水县| 页游| 乌拉特前旗| 房山区| 调兵山市| 淳化县| 额尔古纳市| 忻城县| 昌邑市| 龙门县| 明水县| 玛沁县| 汝州市| 简阳市| 门头沟区| 宜州市| 乌兰县| 喀喇沁旗| 西安市| 耿马| 嘉禾县| 贵定县| 邵阳县|