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