摘要:因為進程退出之后將不再執行事件循環,所有只有那些沒有回調函數的代碼才會被執行。此外,創建的回調函數具有隔離性,他們之間不會相互影響。我們來看的一個簡單例子,他創建了一個子進程,第一個參數是一個命令,第二個參數是回調函數,處理返回結果。
雖然node對操作系統做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統中已經存在的進程進行交互,創建工作子進程。node是一個用于事件循環的線程,但是你可以在這個事件循環之外創建其他的進程(線程)參與工作。
進程模塊
process模塊允許你獲得或者修改當前node進程的設置,不想其他的模塊,process是一個全局進程(node主進程),你可以直接通過process變量直接訪問它。
process實現了EventEmitter接口,exit方法會在當進程退出的時候執行。因為進程退出之后將不再執行事件循環,所有只有那些沒有回調函數的代碼才會被執行。在下面例子中,setTimeout里面的語句是沒有辦法執行到的。
process.on("exit", function () { setTimeout(function () { console.log("This will not run"); }, 100); console.log("Bye."); });
在你接觸node之后,你就會發現那些影響了主事件循環的異常會把整個node進程宕掉的。這會是相當嚴重的問題,所以process提供了另外一個有用的事件uncaughtException來解決這個問題,他會把異常抓取出來供你處理。
process.on("uncaughtException", function (err) { console.log("Caught exception: " + err); }); setTimeout(function () { console.log("This will still run."); }, 500); // Intentionally cause an exception, but don"t catch it. nonexistentFunc(); console.log("This will not run.");
我們來看上面的例子,我們注冊了uncaughtException事件來捕捉系統異常。執行到nonexistentFunc()時,因為該函數沒有定義所以會拋出異常。因為javascript是解釋性的語言,nonexistentFunc()方法上面的語句不會被影響到,他下面的語句不會被執行。所以他的執行結果如下:
Caught exception: ReferenceError: nonexistentFunc is not defined This will still run.
var http = require("http"); var server = http.createServer(function(req,res) { res.writeHead(200, {}); res.end("response"); badLoggingCall("sent response"); console.log("sent response"); }); process.on("uncaughtException", function(e) { console.log(e); }); server.listen(8080);
在這里例子中我們創建了一個web服務器,當處理完請求之后,我們會執行badLoggingCall()方法。因為這個方法不存在,所以會有異常拋出。但是我們注冊的uncaughtException事件會對異常做出處理,這樣服務器不會受到影響得以繼續運行。我們會在服務器端記錄錯誤日志。
[ReferenceError: badLoggingCall is not defined]
與當前進程交互
node提供了一些process的屬性,如下:
process.version:包含當前node實例的版本號;
process.installPrefix:包含安裝路徑;
process.platform:列舉node運行的操作系統的環境,只會顯示內核相關的信息,如:linux2, darwin,而不是“Redhat ES3” ,“Windows 7”,“OSX 10.7”等;
process.uptime():包含當前進程運行的時長(秒);
process.getgid(), process.setgid():獲取或者設置group id;
process.getuid(), process.setuid():獲取或者設計user id;
process.pid:獲取進程id;
process.title:設置進程名稱;
process.execPath:當前node進程的執行路徑,如:/usr/local/bin/node;
process.cwd():當前工作目錄;
process.memoryUsage():node進程內存的使用情況,rss代表ram的使用情況,vsize代表總內存的使用大小,包括ram和swap;
process.heapTotal,process.heapUsed:分別代表v8引擎內存分配和正在使用的大小。
事件循環和ticker
node中提供了process.nextTick()方法,允許你訪問事件循環和延時那你的工作。他有點類似于setTimeout(),他會在下次tick的時候執行,而且每隔一段事件就會執行一次。我們這里有個例子:
var http = require("http"); var s = http.createServer(function(req, res) { res.writeHead(200, {}); res.end("foo"); console.log("http response"); process.nextTick(function(){console.log("tick")}); }); s.listen(8000);
當請求來的時候,會記錄日志‘http response’和‘tick’,當沒有請求的時候,每隔一段事件會執行事件循環,會輸出tick。
此外,nextTick創建的回調函數具有隔離性,他們之間不會相互影響。
process.on("uncaughtException", function(e) { console.log(e); }); process.nextTick(function() { console.log("tick"); }); process.nextTick(function() { iAmAMistake(); console.log("tock"); }); process.nextTick(function() { console.log("tick tock"); }); console.log("End of 1st loop");
在這個例子中,首先輸出‘End of 1st loop’,然后順序的輸出nextTick的回調函數,第一個會正常輸出‘tick’,第二個是一個故意設置的異常會輸出異常信息,不會輸出‘tock’,因為nextTick回調函數的隔離性,第三個任然會輸出‘tick tock’。結果如下:
End of 1st loop tick [ReferenceError: iAmAMistake is not defined] tick tock
子進程
node提供了child_process模塊,允許你為主進程創建子進程,這樣你就可以使用更多的服務器資源,使用更多的cpu,這些概念在前面的章節有介紹。node提供了child_process. spawn()和child_process. exec()為你實現這一功能,下面我們就多帶帶介紹。
child_process.exec( )
我們來看exec的一個簡單例子,他創建了一個子進程,第一個參數是一個shell命令,第二個參數是回調函數,處理返回結果。
var cp = require("child_process"); cp.exec("ls -l", function(e, stdout, stderr) { if(!e) { console.log(stdout); console.log(stderr); } });
exec()還可以傳options的參數:
var options = { encoding: "utf8", timeout: 0, maxBuffer: 200 * 1024, killSignal: "SIGTERM", setsid: false, cwd: null, env: null }; var cp = require("child_process"); cp.exec("ls -l", options, function(e, stdout, stderr) { if(!e) { console.log(stdout); console.log(stderr); } });
encoding:I/O流的編碼格式;
timeout:進程超時時間;
killSignal:當時間或者緩沖區超限時終止進程的信號;
maxBuffer:stdout或stderr可增長的最大值;
setsid:決定在進程中是否創建一個新的會話;
cwd:進程的初始工作目錄,為null時表示使用node的當前工作目錄;
env:進程的環境變量。
child_process.spawn( )
child_process.spawn( )比child_process.exec( )更加強大和靈活,例子如下:
var cp = require("child_process"); var cat = cp.spawn("cat"); cat.stdout.on("data", function(d) { console.log(d.toString()); }); cat.on("exit", function() { console.log("kthxbai"); }); cat.stdin.write("meow"); cat.stdin.end();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107231.html
摘要:事件的監聽與事件的觸發事件一事件機制的實現中大部分的模塊,都繼承自模塊。從另一個角度來看,事件偵聽器模式也是一種事件鉤子的機制,利用事件鉤子導出內部數據或狀態給外部調用者。的核心就是事件發射與事件監聽器功能的封裝。 nodejs事件的監聽與事件的觸發 nodejs事件(Events)showImg(https://segmentfault.com/img/bV0Sqi?w=692&h=...
摘要:如果說用一句話來概括那就是它開啟了服務器端語言。系列的文章并不會從一開始長篇概論的講的歷史,安裝,以及其他很瑣碎的事情。只會專門介紹關于或者準確來講是關于的敏捷開發。性能不對已有的特性進行二次抽象,我們只是在它之上擴展了應用所需的基本功能。 如果說用一句話來概括Node那就是:它開啟了JavaScript服務器端語言。 Node系列的文章并不會從一開始長篇概論的講Node的歷史,安裝,...
摘要:是一個全局內置對象,可以在代碼中的任何位置訪問此對象,這個對象代表我們的代碼宿主的操作系統進程對象。使用對象可以截獲進程的異常退出等事件,也可以獲取進程的當前目錄環境變量內存占用等信息,還可以執行進程退出工作目錄切換等操作。 process是一個全局內置對象,可以在代碼中的任何位置訪問此對象,這個對象代表我們的node.js代碼宿主的操作系統進程對象。使用process對象可以截獲進程...
摘要:動態網站解決方案匯總先擼擼幾個概念單頁面應用,基于框架開發的項目很多都屬于單頁面應用。搜索引擎優化,指通過對網站進行站內優化修復和站外優化,從而提高網站的網站關鍵詞排名以及公司產品的曝光度。為了防止進程掛掉,可以使用來啟動,。 動態網站 SEO解決方案匯總 先擼擼幾個概念: SPA:單頁面應用,基于vue框架開發的項目很多都屬于單頁面應用。 SSR :server side rend...
閱讀 3300·2023-04-25 14:35
閱讀 3423·2021-11-15 18:00
閱讀 2570·2021-11-12 10:34
閱讀 2501·2021-11-11 16:54
閱讀 3484·2021-10-08 10:12
閱讀 2770·2021-09-06 15:02
閱讀 3326·2021-09-04 16:48
閱讀 2806·2019-08-29 14:02