成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js中spawn與exec的異同比較

garfileo / 2787人閱讀

摘要:返回值對象利用給定的命令以及參數(shù)執(zhí)行一個新的進(jìn)程,如果沒有參數(shù)數(shù)組,那么將默認(rèn)是一個空數(shù)組。當(dāng)子進(jìn)程執(zhí)行完畢后將會執(zhí)行的回調(diào)函數(shù),參數(shù)有返回值對象在中運(yùn)行一個命令,并緩存命令的輸出。

前言

眾所周知,Node.js在child_process模塊中提供了spawnexec這兩個方法,用來開啟子進(jìn)程執(zhí)行指定程序。這兩個方法雖然目的一樣,但是既然Node.js為我們提供了兩個方法,那它們之間必然還是會有一些不同之處,下面讓我們來分析一下他們的異同。

首先我們來看看官方API文檔中對它們的說明:

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

command String 將要運(yùn)行的命令。
args Array 字符串參數(shù)數(shù)組。
options 配置對象:

cwd String 子進(jìn)程的當(dāng)前工作目錄。

env Object 環(huán)境變量鍵值對。

stdio Array|String 子進(jìn)程的stdio配置。

detached Boolean 這個子進(jìn)程將會變成進(jìn)程組的領(lǐng)導(dǎo)。

uid Number 設(shè)置用戶進(jìn)程的ID。

gid Number 設(shè)置進(jìn)程組的ID。

返回值: ChildProcess對象

利用給定的命令以及參數(shù)執(zhí)行一個新的進(jìn)程,如果沒有參數(shù)數(shù)組,那么args將默認(rèn)是一個空數(shù)組。

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

command String 將要運(yùn)行的命令,參數(shù)使用空格隔開。
options 配置對象:

cwd String 子進(jìn)程的當(dāng)前工作目錄。

env Object 環(huán)境變量鍵值對。

encoding String 字符編碼(默認(rèn): "utf8")。

shell String 將要執(zhí)行命令的Shell(默認(rèn): 在UNIX中為/bin/sh, 在Windows中為cmd.exe, Shell應(yīng)當(dāng)能識別 -c 開關(guān)在UNIX中,或 /s /cWindows中。 在Windows中,命令行解析應(yīng)當(dāng)能兼容cmd.exe)。

timeout Number 超時時間(默認(rèn): 0)。

maxBuffer Number 在stdout或stderr中允許存在的最大緩沖(二進(jìn)制),如果超出那么子進(jìn)程將會被殺死 (默認(rèn): 200*1024)。

killSignal String 結(jié)束信號(默認(rèn):"SIGTERM")。

detached Boolean 這個子進(jìn)程將會變成進(jìn)程組的領(lǐng)導(dǎo)。

uid Number 設(shè)置用戶進(jìn)程的ID。

gid Number 設(shè)置進(jìn)程組的ID。

callback Function 當(dāng)子進(jìn)程執(zhí)行完畢后將會執(zhí)行的回調(diào)函數(shù),參數(shù)有:

error Error

stdout Buffer

stderr Buffer

返回值: ChildProcess對象

在Shell中運(yùn)行一個命令,并緩存命令的輸出。

異同 從文檔里可以得出的一些相同點:

1,它們都用于開一個子進(jìn)程執(zhí)行指定命令。

2,它們都可以自定義子進(jìn)程的運(yùn)行環(huán)境。

3,它們都返回一個ChildProcess對象,所以他們都可以取得子進(jìn)程的標(biāo)準(zhǔn)輸入流,標(biāo)準(zhǔn)輸出流和標(biāo)準(zhǔn)錯誤流 。

不同點:

1,接受參數(shù)的方式: spawn使用了參數(shù)數(shù)組,而exec則直接接在命令后。

2,子進(jìn)程返回給Node的數(shù)據(jù)量: spawn沒有限制子進(jìn)程可以返回給Node的數(shù)據(jù)大小,而exec則在options配置對象中有maxBuffer參數(shù)限制,且默認(rèn)為200K,如果超出,那么子進(jìn)程將會被殺死,并報錯:Error:maxBuffer exceeded,雖然可以手動調(diào)大maxBuffer參數(shù),但是并不被推薦。由此可窺見一番Node.js設(shè)置這兩個API時的部分本意,spawn應(yīng)用來運(yùn)行返回大量數(shù)據(jù)的子進(jìn)程,如圖像處理,文件讀取等。而exec則應(yīng)用來運(yùn)行只返回少量返回值的子進(jìn)程,如只返回一個狀態(tài)碼。

3,調(diào)用對象: 雖然在官方文檔中,兩個方法接受的第一個參數(shù)標(biāo)注的都是command,即要執(zhí)行的命令,但其實不然。spawn接受的第一個參數(shù)為文件,而exec接受的第一個參數(shù)才是命令。在Node的源碼中關(guān)于spawn的部分有如下一段:

jsvar spawn = exports.spawn = function(file, args, options)

而在exec部分則有如下一段:

js if (process.platform === "win32") {
file = "cmd.exe";
args = ["/s", "/c", """ + command + """];
// Make a shallow copy before patching so we don"t clobber the user"s
// options object.
options = util._extend({}, options);
options.windowsVerbatimArguments = true;
} else {
  file = "/bin/sh";
  args = ["-c", command];
}

所以在Windows下直接運(yùn)行 require("child_process").spawn("dir") 會報異常說沒有此文件,而使用exec則不會。若一定要使用spwan,則應(yīng)寫成require("child_process").spawn("cmd.exe",["s", "c", "dir"])。

4,回調(diào)函數(shù): exec方法相比spawn方法,多提供了一個回調(diào)函數(shù),可以更便捷得獲取子進(jìn)程輸出。這與為返回的ChildProcess對象的stdoutstderr監(jiān)聽data事件來獲得輸出的區(qū)別在于:data事件的方式,會在子進(jìn)程一有數(shù)據(jù)時就觸發(fā),并把數(shù)據(jù)返回給Node。而回調(diào)函數(shù),則會先將數(shù)據(jù)緩存在內(nèi)存中(數(shù)據(jù)量小于maxBuffer參數(shù)),等待子進(jìn)程運(yùn)行完畢后,再調(diào)用回調(diào)函數(shù),并把最終數(shù)據(jù)交給回調(diào)函數(shù)。

參考

http://www.hacksparrow.com/difference-between-spawn-and-exec-of-node-j...

https://cnodejs.org/topic/507285c101d0b80148f7c538

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85738.html

相關(guān)文章

  • Node.js child_process模塊解讀

    摘要:而且方式創(chuàng)建的子進(jìn)程與父進(jìn)程之間建立了通信管道,因此子進(jìn)程和父進(jìn)程之間可以通過的方式發(fā)送消息。與事件的回調(diào)函數(shù)有兩個參數(shù)和,代碼子進(jìn)程最終的退出碼,如果子進(jìn)程是由于接收到信號終止的話,會記錄子進(jìn)程接受的值。 在介紹child_process模塊之前,先來看一個下面的代碼。 const http = require(http); const longComputation = () =>...

    baiy 評論0 收藏0
  • Node模塊--child_process

    摘要:說明模塊是的原始模塊主要作用執(zhí)行命令行命令該模塊的功能主要由函數(shù)提供區(qū)分和執(zhí)行命令第一個參數(shù)是將要執(zhí)行的命令,命令之間的參數(shù)使用空格分開第二個參數(shù)是回調(diào)函數(shù),有三個參數(shù)回調(diào)中的第一個參數(shù)命令執(zhí)行錯誤會有值,否則為回調(diào)中的第二個參數(shù)子進(jìn)程 1.說明 child_process 模塊是 Node.js 的原始模塊: 主要作用:執(zhí)行命令行命令 該模塊的功能主要由 child_process...

    ormsf 評論0 收藏0
  • 基于requirejsvue2項目 (三)

    摘要:這里是打包篇使用的是的進(jìn)行打包思路是通過里面的進(jìn)行項目的初打包因為和里面的引用是動態(tài)生成的所以無法對其進(jìn)行處理這里我們用到了來進(jìn)行文件整合具體看代碼這里是通過配置文件來組裝配置信息對設(shè)置了同步的模板進(jìn)行打包這里是通過 這里是打包篇 使用的是requirejs的r.js進(jìn)行打包 思路是,通過entrance.js里面的require.config進(jìn)行項目的初打包 因為router.js和...

    lijy91 評論0 收藏0
  • 使用node子進(jìn)程spawn,exec踩過

    摘要:最后發(fā)現(xiàn)使用子進(jìn)程打開還真的就是使用到一定程度就掛掉。上面的簡單流程就是啟動一個子進(jìn)程。邏輯就是,記錄子進(jìn)程的大小,一旦超過就掉子進(jìn)程。我們在使用時,不知道設(shè)置,默認(rèn)的是當(dāng)我們子進(jìn)程日志達(dá)到時,自動掉了。 showImg(https://segmentfault.com/img/bVrCnh); 如何在項目中實現(xiàn)熱更新中提到的一個坑child_process的exec使用問題,下面文章...

    cppprimer 評論0 收藏0
  • Node.js多進(jìn)程

    摘要:多進(jìn)程單線程模式運(yùn)行的,使用事件處理并發(fā)。使用子進(jìn)程的執(zhí)行命令緩存子進(jìn)程的輸出。子進(jìn)程退出進(jìn)程執(zhí)行。子進(jìn)程退出子進(jìn)程退出執(zhí)行異步相當(dāng)魔幻飄忽不定綁定兩個事件設(shè)置退出事件子進(jìn)程退出進(jìn)程執(zhí)行。 Node.js多進(jìn)程N(yùn)ode.js單線程模式運(yùn)行的,使用事件處理并發(fā)。 exec() 使用子進(jìn)程的執(zhí)行命令,緩存子進(jìn)程的輸出。并將子進(jìn)程的輸出以回調(diào)函數(shù)參數(shù)的形式進(jìn)行返回 process.argv(...

    sunny5541 評論0 收藏0

發(fā)表評論

0條評論

garfileo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<