国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

garfileo / 2775人閱讀

摘要:返回值對象利用給定的命令以及參數執行一個新的進程,如果沒有參數數組,那么將默認是一個空數組。當子進程執行完畢后將會執行的回調函數,參數有返回值對象在中運行一個命令,并緩存命令的輸出。

前言

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

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

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

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

cwd String 子進程的當前工作目錄。

env Object 環境變量鍵值對。

stdio Array|String 子進程的stdio配置。

detached Boolean 這個子進程將會變成進程組的領導。

uid Number 設置用戶進程的ID。

gid Number 設置進程組的ID。

返回值: ChildProcess對象

利用給定的命令以及參數執行一個新的進程,如果沒有參數數組,那么args將默認是一個空數組。

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

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

cwd String 子進程的當前工作目錄。

env Object 環境變量鍵值對。

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

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

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

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

killSignal String 結束信號(默認:"SIGTERM")。

detached Boolean 這個子進程將會變成進程組的領導。

uid Number 設置用戶進程的ID。

gid Number 設置進程組的ID。

callback Function 當子進程執行完畢后將會執行的回調函數,參數有:

error Error

stdout Buffer

stderr Buffer

返回值: ChildProcess對象

在Shell中運行一個命令,并緩存命令的輸出。

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

1,它們都用于開一個子進程執行指定命令。

2,它們都可以自定義子進程的運行環境。

3,它們都返回一個ChildProcess對象,所以他們都可以取得子進程的標準輸入流,標準輸出流和標準錯誤流 。

不同點:

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

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

3,調用對象: 雖然在官方文檔中,兩個方法接受的第一個參數標注的都是command,即要執行的命令,但其實不然。spawn接受的第一個參數為文件,而exec接受的第一個參數才是命令。在Node的源碼中關于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下直接運行 require("child_process").spawn("dir") 會報異常說沒有此文件,而使用exec則不會。若一定要使用spwan,則應寫成require("child_process").spawn("cmd.exe",["s", "c", "dir"])

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

參考

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85738.html

相關文章

  • Node.js child_process模塊解讀

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

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

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

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

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

    lijy91 評論0 收藏0
  • 使用node子進程spawn,exec踩過

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

    cppprimer 評論0 收藏0
  • Node.js多進程

    摘要:多進程單線程模式運行的,使用事件處理并發。使用子進程的執行命令緩存子進程的輸出。子進程退出進程執行。子進程退出子進程退出執行異步相當魔幻飄忽不定綁定兩個事件設置退出事件子進程退出進程執行。 Node.js多進程Node.js單線程模式運行的,使用事件處理并發。 exec() 使用子進程的執行命令,緩存子進程的輸出。并將子進程的輸出以回調函數參數的形式進行返回 process.argv(...

    sunny5541 評論0 收藏0

發表評論

0條評論

garfileo

|高級講師

TA的文章

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