<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
之前看多程序這一章節時發現這塊東西挺多,寫Process模組的時候也有提到,今天下午午休醒來靜下心來好好的看了一遍,發現也不是太難理解。
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時,就不能將訊息傳送給子程序。
exec()函數在一個子shell中執行系統命令。幾乎可以執行能從控制檯提示符下執行的任何東西,如二進位制可執行檔案、shell指令碼、Python指令碼或批次檔。
exec(command,[options],callback)函數返回一個ChildProcess物件
command:字串,指定在子shell中執行的命令。
options:物件,指定執行命令時使用的設定。選項如下:
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)JetBrainsWebStorm 11.0.3binrunnerw.exe" F:nodejsnode.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
它與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); });
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); });
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)JetBrainsWebStorm 11.0.3binrunnerw.exe" F:nodejsnode.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程序管理之子程序的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45