摘要:在中,只支持單線程。在這種場合下,如果能夠使用多進程,則可以為每個請求分配一個進程,從而可以更好地使用服務器端的資源。進程進程對象的屬性用于運行應用程序的可執(zhí)行文件的絕對路徑的版本號及其各依賴的版本號當前運行的平臺用于讀入標準輸入流的對象。
Process
在Node.js中,只支持單線程。但是在應用程序中,如果只使用單線程進行操作,從接收請求開始到返回響應為止的這段時間內可能存在很長的一段等待時間。在這種場合下,如果能夠使用多進程,則可以為每個請求分配一個進程,從而可以更好地使用服務器端的CPU資源。為了實現多線程處理,Node.js中提供了child_process模塊與cluster模塊,其中的child_process模塊用于實現在Node.js應用程序中開啟多個子進程,并在各個子進程中運行各種不同的命令或執(zhí)行Node.js模塊文件,可執(zhí)行文件的處理,cluster模塊用于實現在Node.js應用程序中開啟多個子進程,在每個子進程中運行一個Node.js應用程序副本的處理。1. 進程 1.1 進程對象的屬性
process.execPath: 用于運行應用程序的可執(zhí)行文件的絕對路徑
version: Node.js的版本號
versions: Node.js及其各依賴的版本號
platform: 當前運行Node.js的平臺
stdin: 用于讀入標準輸入流的對象。默認情況下,標準輸入流處于暫停狀態(tài),比如恢復讀取標準輸入流process.stdin.resume()
stdout: 用于寫入標準輸出流的對象
stderr: 用于寫入標準錯誤輸出流的對象
與其他寫入流數據的對象不同,process.stdout對象與process.stderr對象的寫數據操作是一種阻塞型操作
只有當使用其他讀取流數據的對象的pipe方法,并且將process.stdout對象或process.stderr對象作為目標對象的時候,process.stdout對象與process.stderr對象的寫數據操作才是非阻塞型操作。
argv: 屬性值為一個數組,包含了運行Node.js應用程序時所有命令行參數。
env: 運行Node.js應用程序的操作系統(tǒng)的信息
config: 包含了用于編譯當前Node.js應用程序的可執(zhí)行文件的配置選項的JavaScript描述
pid: 運行當前Node.js應用程序的進程PID
title: 運行當前Node.js應用程序命令行窗口的標題
arch: 運行當前Node.js應用程序的處理器架構,arm,ia32,x64等
1.2 進程對象的方法 1.2.1 內存使用量memoryUsage()該方法不使用任何參數,返回一個對象,對象所擁有的屬性如下
rss: 屬性值為一個整數,表示運行Node.js應用程序的進程的內存消耗量,單位為字節(jié)
headTotal: 屬性值為一個整數,表示為V8所分配的內存量,單位為字節(jié)
headUsed: 屬性值為一個整數,表示V8的內存消耗量,單位為字節(jié)
1.2.2 nextTick()方法process.nextTick(callback)參數為被推遲的函數
用于將一個函數推遲到代碼中所書寫的下一個同步方法執(zhí)行完畢時,或異步方法的事件回調函數開始執(zhí)行時調用。
作用與將setTimeout方法的事件參數值指定為0的作用相同
但是nextTick()方法中指定的函數的調用速度比setTimeout方法中指定的函數的調用速度快很多
在讀取完畢文件后調用nextTick()
const process = require("process"); const fs = require("fs"); var finish = function () { console.log("文件讀取完畢"); } process.nextTick(finish); console.log(fs.readFileSync("./fs.js").toString());
指定兩個耗時操作同步進行
const process = require("process"); const fs = require("fs"); function foo() { process.nextTick(Task); } function Task() { var file = fs.createReadStream("./fs.js"); file.on("data", (data) => { console.log("Task函數中,讀取到字節(jié)長度:", data.length); }) } var file = fs.createReadStream("./fs.js"); file.on("data", (data) => { console.log("全局中,讀取到字節(jié)長度:", data.length); }); foo();
在Node.js中,提供了一個process.maxTickDepth屬性,默認的屬性值為1000,當遞歸深度達到process.maxTickDepth屬性值之后,允許遞歸函數之外的代碼繼續(xù)執(zhí)行,但是會發(fā)出警告,提醒開發(fā)者改用setImmediate方法
1.2.3 process.abort()方法向運行Node.js應用程序的進程發(fā)出SIGABRT信號,使進程異常終止,同時產生一個核心文件,該方法中不使用任何參數
1.2.4 改變文件目錄process.chdir()修改Node.js應用程序中使用的當前工作目錄
process.chdir(directory)
參數可以為一個字符串,用于指定當前工作目錄,該目錄可以為一個相對路徑,也可以為一個絕對路徑。如果指定路徑不存在,報錯。
1.2.5 返回當前目錄process.cwd()const process = require("process"); console.log("當前目錄:" + process.cwd()); process.chdir("../"); console.log("上層目錄:" + process.cwd());1.2.6 退出程序process.exit()
退出運行Node.js應用程序的進程
使用一個整數值參數,指定為操作系統(tǒng)提供退出代碼,代碼為0表示正常退出,不使用該參數時的默認參數值為0
1.2.7 設置或返回進程的組IDprocess.getgid() 返回運行Node.js應用程序的進程的組ID,該方法只有在非windows操作系統(tǒng)下有效,不使用任何參數
process.setgid(id) 用于設置運行Node.js應用程序的進程的組ID,該方法只有在非windows操作系統(tǒng)下有效,不使用任何參數
setgid方法中使用一個參數,參數值可以為一個整數類型的組ID,也可以為一個字符串類型的組名,如果指定組名,該組名將自動解析為組ID
1.2.8 設置或返回進程的用戶IDprocess.getuid() 返回運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操作系統(tǒng)下有效,不使用任何參數
process.setuid(id) 用于設置運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操作系統(tǒng)下有效
1.2.9 向進程發(fā)送信號process.kill(pid, [signal])用于向進程發(fā)送信號
pid參數為必須指定參數,signal參數為可選參數,pid參數為一個整數,用于指定需要接收信號的進程ID,signal參數值為一個字符串,用于指定需要發(fā)送的信號,例如SIGINT或SIGUSR1,當不使用該參數時,默認參數值為SIGTERM,表示終止該進程
1.2.9 讀取或修改進程的文件權限掩碼umask([mask])用于讀取或修改運行Node.js應用程序的進程的文件權限掩碼。
子進程將繼承父進程的文件權限掩碼
參數用于設定修改后的文件權限掩碼,如果不使用參數,返回進程當前使用的文件的權限掩碼
const process = require("process"); var oldmask, newmask = 0644; oldmask = process.umask(newmask); console.log("修改前的掩碼:", oldmask.toString(8)); console.log("修改后的掩碼:", newmask.toString(8)); /**** * 修改前的掩碼: 0 * 修改后的掩碼: 644 */1.2.10 時間
返回當前運行時間(秒)process.uptime()
測試一個代碼運行時間process.hrtime()
const process = require("process"); let time = process.hrtime(); for (let i = 0; i < 1000; i++) { } var endTime = process.hrtime(time); console.log(endTime);1.3 進程對象的事件 1.3.1 退出事件exit
const process = require("process"); process.on("exit", () => { console.log("Node.js程序退出"); }); process.exit();1.3.2 異常事件uncaughtException
const process = require("process"); process.on("uncaughtException", (err) => { console.log("捕獲到一個異常錯誤", err); }); undefinedFunction();1.3.3 各種信號事件
當運行Node.js應用程序的進程接收到各種事件是,會觸發(fā)各種信號事件
可以通過對這些事件進行監(jiān)聽并指定事件回調函數的方法對該信號進行處理,回調函數不需要任何參數。
1.4 創(chuàng)建多進程應用程序 1.4.1 使用spawn方法開啟子進程child_process.spawn(command, [args], [options])
command參數值為一個字符串,指定需要運行的命令
args為一個數組,存放了所有運行該命令時所需要使用的參數,參數的指定順序與數組中的元素順序保持一致,默認為空
option參數值為一個對象,用于指定開啟子進程時所使用的選項
cwd: 指定子進程當前的工作目錄
stdio: 設置子進程的標準輸入/輸出
customFds: 數組,子進程的標準輸入/輸出指定文件描述符
env: 為子進程指定環(huán)境變量,不指定時,沒有可以使用的環(huán)境變量
detached: 布爾值,該子進程為一個進程組中的領頭進程
uid: 設置子進程的用戶ID
gid: 設置子進程的組ID
const process = require("process"); const cp = require("child_process"); let sp1 = cp.spawn("node", ["test1.js", "one", "two", "three"], {cwd: "./one"}) let sp2 = cp.spawn("node", ["test2.js"], {stdio: "pipe"}); sp1.stdout.on("data", (data)=>{ console.log("子進程 sp1 標注輸出:", data); sp2.stdin.write(data); }); sp1.on("exit", (code, signal)=>{ console.log("子進程 sp1 退出,退出代碼為", code); process.exit(); });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92956.html
摘要:中各種用于讀取數據的對象對象描述用于讀取文件代表客戶端請求或服務器端響應代表一個端口對象用于創(chuàng)建子進程的標準輸出流。如果子進程和父進程共享輸入輸出流,則子進程的標準輸出流被廢棄用于創(chuàng)建子進程的標準錯誤輸出流。 9. stream流 fs模塊中集中文件讀寫方法的區(qū)別 用途 使用異步方式 使用同步方式 將文件完整讀入緩存區(qū) readFile readFileSync 將文件部...
摘要:是一個全局變量,對象的屬性。的源碼啟動進程,評估時返回函數失敗。調用監(jiān)聽器回調函數時會將的值作為唯一參數傳入。信號列表詳見標準的信號名,如等。返回一個對象,描述了進程所用的內存狀況,單位為字節(jié)。一旦當前事件循環(huán)結束,調用回調函數。 process是一個全局變量,global對象的屬性。它的作用是描述當前Node.js進程狀態(tài)的對象,提供了一個與操作系統(tǒng)的簡單接口。通常在你寫本地命令程序...
摘要:可以通過監(jiān)聽該對象的事件并指定事件回調函數的方法來實現當捕捉到錯誤時的處理。 1. 捕獲錯誤 try...catch機制不能捕獲異步方法拋出的錯誤 uncaughtException時間可以捕獲任何未被處理的錯誤,但是可能會引起內存泄漏等情況 2. domain模塊獲取錯誤 使用domian模塊中的create方法創(chuàng)建一個domain對象,var domain = domain...
摘要:在談如何做到進程平滑離場前,我們需要一種機制,這種機制能讓我們主動通知進程何時離場,這就涉及到進程間通信的知識了,我們先簡單了解下。進程間通信對或類系統(tǒng)而言,進程間通信的方式有很多種信號是其中的一種。 本文由云+社區(qū)發(fā)表作者:草小灰 使用 Node.js 搭建 HTTP Server 已是司空見慣的事。在生產環(huán)境中,Node 進程平滑重啟直接關系到服務的可靠性,它的重要性不容我們忽視...
閱讀 3813·2023-04-26 02:07
閱讀 3686·2021-10-27 14:14
閱讀 2874·2021-10-14 09:49
閱讀 1637·2019-08-30 15:43
閱讀 2630·2019-08-29 18:33
閱讀 2382·2019-08-29 17:01
閱讀 925·2019-08-29 15:11
閱讀 602·2019-08-29 11:06