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

資訊專欄INFORMATION COLUMN

nodejs之process進(jìn)程小記

Binguner / 1049人閱讀

摘要:因?yàn)檫M(jìn)程退出之后將不再執(zhí)行事件循環(huán),所有只有那些沒有回調(diào)函數(shù)的代碼才會(huì)被執(zhí)行。此外,創(chuàng)建的回調(diào)函數(shù)具有隔離性,他們之間不會(huì)相互影響。我們來看的一個(gè)簡(jiǎn)單例子,他創(chuàng)建了一個(gè)子進(jìn)程,第一個(gè)參數(shù)是一個(gè)命令,第二個(gè)參數(shù)是回調(diào)函數(shù),處理返回結(jié)果。

雖然node對(duì)操作系統(tǒng)做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統(tǒng)中已經(jīng)存在的進(jìn)程進(jìn)行交互,創(chuàng)建工作子進(jìn)程。node是一個(gè)用于事件循環(huán)的線程,但是你可以在這個(gè)事件循環(huán)之外創(chuàng)建其他的進(jìn)程(線程)參與工作。

  進(jìn)程模塊

  process模塊允許你獲得或者修改當(dāng)前node進(jìn)程的設(shè)置,不想其他的模塊,process是一個(gè)全局進(jìn)程(node主進(jìn)程),你可以直接通過process變量直接訪問它。

  process實(shí)現(xiàn)了EventEmitter接口,exit方法會(huì)在當(dāng)進(jìn)程退出的時(shí)候執(zhí)行。因?yàn)檫M(jìn)程退出之后將不再執(zhí)行事件循環(huán),所有只有那些沒有回調(diào)函數(shù)的代碼才會(huì)被執(zhí)行。在下面例子中,setTimeout里面的語句是沒有辦法執(zhí)行到的。

process.on("exit", function () {
  setTimeout(function () {
    console.log("This will not run");
  }, 100);
  console.log("Bye.");
});

  在你接觸node之后,你就會(huì)發(fā)現(xiàn)那些影響了主事件循環(huán)的異常會(huì)把整個(gè)node進(jìn)程宕掉的。這會(huì)是相當(dāng)嚴(yán)重的問題,所以process提供了另外一個(gè)有用的事件uncaughtException來解決這個(gè)問題,他會(huì)把異常抓取出來供你處理。

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.");

  我們來看上面的例子,我們注冊(cè)了uncaughtException事件來捕捉系統(tǒng)異常。執(zhí)行到nonexistentFunc()時(shí),因?yàn)樵摵瘮?shù)沒有定義所以會(huì)拋出異常。因?yàn)閖avascript是解釋性的語言,nonexistentFunc()方法上面的語句不會(huì)被影響到,他下面的語句不會(huì)被執(zhí)行。所以他的執(zhí)行結(jié)果如下:

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);

  在這里例子中我們創(chuàng)建了一個(gè)web服務(wù)器,當(dāng)處理完請(qǐng)求之后,我們會(huì)執(zhí)行badLoggingCall()方法。因?yàn)檫@個(gè)方法不存在,所以會(huì)有異常拋出。但是我們注冊(cè)的uncaughtException事件會(huì)對(duì)異常做出處理,這樣服務(wù)器不會(huì)受到影響得以繼續(xù)運(yùn)行。我們會(huì)在服務(wù)器端記錄錯(cuò)誤日志。

[ReferenceError: badLoggingCall is not defined]

 與當(dāng)前進(jìn)程交互

  node提供了一些process的屬性,如下:

process.version:包含當(dāng)前node實(shí)例的版本號(hào);

process.installPrefix:包含安裝路徑;

process.platform:列舉node運(yùn)行的操作系統(tǒng)的環(huán)境,只會(huì)顯示內(nèi)核相關(guān)的信息,如:linux2, darwin,而不是“Redhat ES3” ,“Windows 7”,“OSX 10.7”等;

process.uptime():包含當(dāng)前進(jìn)程運(yùn)行的時(shí)長(zhǎng)(秒);

process.getgid(), process.setgid():獲取或者設(shè)置group id;

process.getuid(), process.setuid():獲取或者設(shè)計(jì)user id;

process.pid:獲取進(jìn)程id;

process.title:設(shè)置進(jìn)程名稱;

process.execPath:當(dāng)前node進(jìn)程的執(zhí)行路徑,如:/usr/local/bin/node;

process.cwd():當(dāng)前工作目錄;

process.memoryUsage():node進(jìn)程內(nèi)存的使用情況,rss代表ram的使用情況,vsize代表總內(nèi)存的使用大小,包括ram和swap;

process.heapTotal,process.heapUsed:分別代表v8引擎內(nèi)存分配和正在使用的大小。

  事件循環(huán)和ticker

  node中提供了process.nextTick()方法,允許你訪問事件循環(huán)和延時(shí)那你的工作。他有點(diǎn)類似于setTimeout(),他會(huì)在下次tick的時(shí)候執(zhí)行,而且每隔一段事件就會(huì)執(zhí)行一次。我們這里有個(gè)例子:

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);

 當(dāng)請(qǐng)求來的時(shí)候,會(huì)記錄日志‘http response’和‘tick’,當(dāng)沒有請(qǐng)求的時(shí)候,每隔一段事件會(huì)執(zhí)行事件循環(huán),會(huì)輸出tick。

  此外,nextTick創(chuàng)建的回調(diào)函數(shù)具有隔離性,他們之間不會(huì)相互影響。

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");

 在這個(gè)例子中,首先輸出‘End of 1st loop’,然后順序的輸出nextTick的回調(diào)函數(shù),第一個(gè)會(huì)正常輸出‘tick’,第二個(gè)是一個(gè)故意設(shè)置的異常會(huì)輸出異常信息,不會(huì)輸出‘tock’,因?yàn)閚extTick回調(diào)函數(shù)的隔離性,第三個(gè)任然會(huì)輸出‘tick tock’。結(jié)果如下:

End of 1st loop
tick
[ReferenceError: iAmAMistake is not defined]
tick tock

子進(jìn)程

  node提供了child_process模塊,允許你為主進(jìn)程創(chuàng)建子進(jìn)程,這樣你就可以使用更多的服務(wù)器資源,使用更多的cpu,這些概念在前面的章節(jié)有介紹。node提供了child_process. spawn()和child_process. exec()為你實(shí)現(xiàn)這一功能,下面我們就多帶帶介紹。

  

  child_process.exec( )

  我們來看exec的一個(gè)簡(jiǎn)單例子,他創(chuàng)建了一個(gè)子進(jìn)程,第一個(gè)參數(shù)是一個(gè)shell命令,第二個(gè)參數(shù)是回調(diào)函數(shù),處理返回結(jié)果。

var cp = require("child_process");
cp.exec("ls -l", function(e, stdout, stderr) {
  if(!e) {
    console.log(stdout);
    console.log(stderr);
  }
});

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

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:進(jìn)程超時(shí)時(shí)間;

killSignal:當(dāng)時(shí)間或者緩沖區(qū)超限時(shí)終止進(jìn)程的信號(hào);

maxBuffer:stdout或stderr可增長(zhǎng)的最大值;

setsid:決定在進(jìn)程中是否創(chuàng)建一個(gè)新的會(huì)話;

cwd:進(jìn)程的初始工作目錄,為null時(shí)表示使用node的當(dāng)前工作目錄;

env:進(jìn)程的環(huán)境變量。

  child_process.spawn( )

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

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();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107231.html

相關(guān)文章

  • Node事件機(jī)制小記

    摘要:事件的監(jiān)聽與事件的觸發(fā)事件一事件機(jī)制的實(shí)現(xiàn)中大部分的模塊,都繼承自模塊。從另一個(gè)角度來看,事件偵聽器模式也是一種事件鉤子的機(jī)制,利用事件鉤子導(dǎo)出內(nèi)部數(shù)據(jù)或狀態(tài)給外部調(diào)用者。的核心就是事件發(fā)射與事件監(jiān)聽器功能的封裝。 nodejs事件的監(jiān)聽與事件的觸發(fā) nodejs事件(Events)showImg(https://segmentfault.com/img/bV0Sqi?w=692&h=...

    airborne007 評(píng)論0 收藏0
  • nodejsexpress小記

    摘要:如果說用一句話來概括那就是它開啟了服務(wù)器端語言。系列的文章并不會(huì)從一開始長(zhǎng)篇概論的講的歷史,安裝,以及其他很瑣碎的事情。只會(huì)專門介紹關(guān)于或者準(zhǔn)確來講是關(guān)于的敏捷開發(fā)。性能不對(duì)已有的特性進(jìn)行二次抽象,我們只是在它之上擴(kuò)展了應(yīng)用所需的基本功能。 如果說用一句話來概括Node那就是:它開啟了JavaScript服務(wù)器端語言。 Node系列的文章并不會(huì)從一開始長(zhǎng)篇概論的講Node的歷史,安裝,...

    awokezhou 評(píng)論0 收藏0
  • nadejs進(jìn)程管理小記

    摘要:是一個(gè)全局內(nèi)置對(duì)象,可以在代碼中的任何位置訪問此對(duì)象,這個(gè)對(duì)象代表我們的代碼宿主的操作系統(tǒng)進(jìn)程對(duì)象。使用對(duì)象可以截獲進(jìn)程的異常退出等事件,也可以獲取進(jìn)程的當(dāng)前目錄環(huán)境變量?jī)?nèi)存占用等信息,還可以執(zhí)行進(jìn)程退出工作目錄切換等操作。 process是一個(gè)全局內(nèi)置對(duì)象,可以在代碼中的任何位置訪問此對(duì)象,這個(gè)對(duì)象代表我們的node.js代碼宿主的操作系統(tǒng)進(jìn)程對(duì)象。使用process對(duì)象可以截獲進(jìn)程...

    dendoink 評(píng)論0 收藏0
  • 動(dòng)態(tài)網(wǎng)站SEO解決方案經(jīng)驗(yàn)匯總

    摘要:動(dòng)態(tài)網(wǎng)站解決方案匯總先擼擼幾個(gè)概念單頁(yè)面應(yīng)用,基于框架開發(fā)的項(xiàng)目很多都屬于單頁(yè)面應(yīng)用。搜索引擎優(yōu)化,指通過對(duì)網(wǎng)站進(jìn)行站內(nèi)優(yōu)化修復(fù)和站外優(yōu)化,從而提高網(wǎng)站的網(wǎng)站關(guān)鍵詞排名以及公司產(chǎn)品的曝光度。為了防止進(jìn)程掛掉,可以使用來啟動(dòng),。 動(dòng)態(tài)網(wǎng)站 SEO解決方案匯總 先擼擼幾個(gè)概念: SPA:?jiǎn)雾?yè)面應(yīng)用,基于vue框架開發(fā)的項(xiàng)目很多都屬于單頁(yè)面應(yīng)用。 SSR :server side rend...

    UsherChen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<