NodeJs簡明教程(8)

NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!node

關注獲取更多NodeJs精品文章 shell

二維碼

本文是NodeJs簡明教程的第八篇,將介紹NodeJs 子進程 模塊相關的基本操做。數組

child_process 模塊提供了衍生子進程的能力(以一種與 popen(3) 相似但不相同的方式)。微信

NodeJs的JS線程雖然是單線程,不能利用多核CPU,也不能執行CPU密集型的任務,可是經過派生子進程的形式加上IPC(進程間通訊),能夠充分利用多核CPU。函數

spawn

spawn能夠執行指定的命令spawn的函數原型以下:學習

child_process.spawn(command[,args][,options])
複製代碼
  • command <string> 要執行的命令
  • args <string[]> 傳給命令的參數列表
  • options <Object> 額外選項
    • cwd <string> 子進程workdir
    • env <Object> 子進程環境變量
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']); // 命令配置

ls.stdout.on('data', (data) => { // 監聽命令執行的標準輸出
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => { // 監聽命令執行的標準錯誤輸出
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => { // 監聽子進程退出
  console.log(`子進程退出,使用退出碼 ${code}`);
});
複製代碼

以上例程輸出(不一樣機器輸出可能不同)ui

stdout: total 0
drwxr-xr-x  970 root  wheel    30K  7 19 23:00 bin
drwxr-xr-x  306 root  wheel   9.6K  7 12 22:35 lib
drwxr-xr-x  249 root  wheel   7.8K  7 19 23:00 libexec
drwxr-xr-x   15 root  wheel   480B  4  1 14:15 local
drwxr-xr-x  239 root  wheel   7.5K  7 12 22:35 sbin
drwxr-xr-x   46 root  wheel   1.4K  9 21  2018 share
drwxr-xr-x    5 root  wheel   160B  9 21  2018 standalone

子進程退出,使用退出碼 0
複製代碼

exec

exec也能夠執行指定的命令,與spawn區別是執行結果經過回調通知,spawn是經過事件,exec函數原型以下:spa

exec(command[,options][,callback])
複製代碼
  • command <string> 要執行的命令,命令參數使用空格分隔
  • options <Object> 額外選項
    • cwd <string> 子進程workdir
    • env <Object> 子進程環境變量
    • timeout <number> 子進程執行超時
  • callback <Function> 執行結果回調
    • error <Error> 執行錯誤(不是子進程的錯誤輸出)
    • stdout <string|Buffer> 子進程標準輸出
    • stderr <string|Buffer> 子進程標準錯誤輸出
const exec = require('child_process').exec;

exec('ls -lh /usr',function(err,stdout,stderr) {
    if(err) {
        console.log('執行錯誤', err);
    }
    console.log('stdout', stdout);
    console.log('stderr', stderr);
});
複製代碼

以上例程輸出線程

stdout: total 0
drwxr-xr-x  970 root  wheel    30K  7 19 23:00 bin
drwxr-xr-x  306 root  wheel   9.6K  7 12 22:35 lib
drwxr-xr-x  249 root  wheel   7.8K  7 19 23:00 libexec
drwxr-xr-x   15 root  wheel   480B  4  1 14:15 local
drwxr-xr-x  239 root  wheel   7.5K  7 12 22:35 sbin
drwxr-xr-x   46 root  wheel   1.4K  9 21  2018 share
drwxr-xr-x    5 root  wheel   160B  9 21  2018 standalone

子進程退出,使用退出碼 0
複製代碼

execFile

execFile相似於exec,但默認狀況下不會派生shell, 相反,指定的可執行文件 file 會做爲新進程直接地衍生,使其比 exec稍微更高效。code

支持與exec相同的選項。 因爲沒有衍生 shell,所以不支持 I/O 重定向和文件通配等行爲execFile原型:

execFile(file[,args][,options][,callback])
複製代碼
  • file <string> 要執行的命令或可執行文件路徑
  • args <string[]> 字符串數組形式的參數列表
  • options <Object> 額外選項
    • cwd <string> 子進程workdir
    • env <Object> 子進程環境變量
    • timeout <number> 子進程執行超時
  • callback <Function> 執行結果回調
    • error <Error> 執行錯誤(不是子進程的錯誤輸出)
    • stdout <string|Buffer> 子進程標準輸出
    • stderr <string|Buffer> 子進程標準錯誤輸出
const execFile = require('child_process').execFile;
execFile('ls', ['--version'], function(error, stdout, stderr) {
    if(err) {
        console.log('執行錯誤', err);
    }
    console.log('stdout', stdout);
    console.log('stderr', stderr);
});
複製代碼

以上例程輸出同exec

fork

forkspawn的一個特例,專門用於派生新的NodeJs進程spawn能夠派生任何進程fork方法原型以下:

fork(modulePath[,args][,options])
複製代碼
  • modulePath <string> 要執行的JS路徑
  • args <string[]> 字符串數組形式的參數列表
  • options <Object> 額外選項
    • cwd <string> 子進程的workdir
    • env <Object> 環境變量
    • silent <boolean> 若是爲 true,則子進程的 stdin、stdout 和 stderr 將會被輸送到父進程,不然它們將會繼承自父進程。默認false

b.js

const fork = require('child_process').fork;

const child = fork('./a.js',{silent:true}); // silent爲true時能夠監聽子進程標準輸出和標準錯誤輸出
child.stdout.on('data',function(data){ // 監聽子進程標準輸出
    console.log('child stdout', data.toString('utf8'));
});
child.stderr.on('data', function(data){ // 監聽子進程標準錯誤輸出
    console.log('child stderr', data.toString('utf8'));
});
child.on('close', function(){
    console.log('child exit');
});
複製代碼

a.js

console.log('我是子進程`);
複製代碼

終端執行node b.js,以上例程輸出:

child stdout 我是子進程

child exit
複製代碼

結語

子進程模塊的介紹到此就告一段落了,通常狀況下使用spawnexecFile便可。有任何疑問請掃碼加羣交流:

微信羣
相關文章
相關標籤/搜索