天天看點

node.js入門 - 12.api:程序(process)

  雖然node對作業系統做了很多抽象的工作,但是你還是可以直接和他互動,比如和系統中已經存在的程序進行互動,建立工作子程序。node是一個用于事件循環的線程,但是你可以在這個事件循環之外建立其他的程序(線程)參與工作。

  程序子產品

  process子產品允許你獲得或者修改目前node程序的設定,不想其他的子產品,process是一個全局程序,你可以直接通過process變量直接通路它。

  process實作了EventEmitter接口,exit方法會在當程序退出的時候執行。因為程序退出之後将不再執行事件循環,所有隻有那些沒有回調函數的代碼才會被執行。在下面例子中,setTimeout裡面的語句是沒有辦法執行到的。

  在你接觸node之後,你就會發現那些影響了主事件循環的異常會把整個node程序宕掉的。這會是相當嚴重的問題,是以process提供了另外一個有用的事件uncaughtException來解決這個問題,他會把異常抓取出來供你處理。

   我們來看上面的例子,我們注冊了uncaughtException事件來捕捉系統異常。執行到nonexistentFunc()時,因為該函數沒有定義是以會抛出異常。因為javascript是解釋性的語言,nonexistentFunc()方法上面的語句不會被影響到,他下面的語句不會被執行。是以他的執行結果如下:

  我們再看一個例子。

   在這裡例子中我們建立了一個web伺服器,當處理完請求之後,我們會執行badLoggingCall()方法。因為這個方法不存在,是以會有異常抛出。但是我們注冊的uncaughtException事件會對異常做出處理,這樣伺服器不會受到影響得以繼續運作。我們會在伺服器端記錄錯誤日志。

   與目前程序互動

  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的時候執行,而且每隔一段事件就會執行一次。我們這裡有個例子:

  當請求來的時候,會記錄日志‘http response’和‘tick’,當沒有請求的時候,每隔一段事件會執行事件循環,會輸出tick。

  此外,nextTick建立的回調函數具有隔離性,他們之間不會互相影響。

  在這個例子中,首先輸出‘End of 1st loop’,然後順序的輸出nextTick的回調函數,第一個會正常輸出‘tick’,第二個是一個故意設定的異常會輸出異常資訊,不會輸出‘tock’,因為nextTick回調函數的隔離性,第三個任然會輸出‘tick tock’。結果如下:

  子程序

  node提供了child_process子產品,允許你為主程序建立子程序,這樣你就可以使用更多的伺服器資源,使用更多的cpu,這些概念在前面的章節有介紹。node提供了child_process. spawn()和child_process. exec()為你實作這一功能,下面我們就單獨介紹。

  

  child_process.exec( )

  我們來看exec的一個簡單例子,他建立了一個子程序,第一個參數是一個shell指令,第二個參數是回調函數,處理傳回結果。

exec()還可以傳options的參數:

encoding:I/O流的編碼格式;

timeout:程序逾時時間;

killSignal:當時間或者緩沖區超限時終止程序的信号;

maxBuffer:stdout或stderr可增長的最大值;

setsid:決定在程序中是否建立一個新的會話;

cwd:程序的初始工作目錄,為null時表示使用node的目前工作目錄;

env:程序的環境變量。

  child_process.spawn( )

  child_process.spawn( )比child_process.exec( )更加強大和靈活,例子如下:

<a href="http://www.vancl.com/?source=kbh1983&amp;sourcesuninfo=ad-3090-1-52-0-1" target="_blank"></a>