Posted on 2011-05-31 00:33
dennis 閱讀(3526)
評(píng)論(7) 編輯 收藏 所屬分類(lèi):
node.js
node.js的API文檔做的不是很好,有些部分干脆沒(méi)文檔,最終還是要看代碼才能解決。我這里將記錄下看源碼過(guò)程中看到的一些API并補(bǔ)充一些測(cè)試?yán)印T谕?a >node.js的朋友可以瞧瞧。
process.reallyExit(status) 用于進(jìn)程主動(dòng)退出,status設(shè)置退出的狀態(tài)碼。請(qǐng)注意,reallyExit退出的進(jìn)程不會(huì)調(diào)用'exit'事件,下面的代碼不會(huì)有任何輸出:
var interval=setInterval(function(){
process.reallyExit(1);
},1000);
process.on('exit',function(){
console.log("hello");
});
process._kill(pid,sig) 用于給指定pid的進(jìn)程發(fā)送指定信號(hào)(類(lèi)似kill命令),這是個(gè)“private”方法,你需要慎重使用,下面的代碼會(huì)殺死自身的進(jìn)程:
var pid=process.pid
process._kill(pid,9);
process.binding(name) 非常有用的方法,很奇怪API文檔里竟然沒(méi)提到,這個(gè)方法用于返回指定名稱(chēng)的內(nèi)置模塊。例如下面的代碼將打印node_net模塊所有的可以調(diào)用的方法或變量(很多是文檔沒(méi)有提到的并且沒(méi)有exports的,后續(xù)我會(huì)介紹下):
var binding=process.binding('net');
console.dir(binding);
process.dlopen(filename,target) 看源碼注釋說(shuō)是用來(lái)動(dòng)態(tài)加載node.module的動(dòng)態(tài)鏈接庫(kù)的,以后嘗試寫(xiě)擴(kuò)展的時(shí)候也許可以嘗試一下。
定時(shí)器 Node.js的定時(shí)器模塊的實(shí)現(xiàn)是有講究的,對(duì)于超時(shí)時(shí)間after<=0的callback,會(huì)在內(nèi)部new一個(gè)Timer并start(本質(zhì)是使用libev的timer機(jī)制);但是對(duì)于after>0的callback,卻不是這樣。因?yàn)樵趯?shí)際應(yīng)用中,大多數(shù)定時(shí)器事件的超時(shí)時(shí)間都是一樣的,如果每個(gè)事件都new一個(gè)Timer并start,代價(jià)太高。因此node.js采用了一個(gè)類(lèi)似哈希表的方案,將相同after超時(shí)時(shí)間的定時(shí)器事件組織成鏈表,以after為key,以鏈表為value整體構(gòu)成一張表。每個(gè)鏈表只new一個(gè)Timer,這個(gè)Timer負(fù)責(zé)整個(gè)鏈表的定時(shí)器事件,當(dāng)某個(gè)事件超時(shí)調(diào)用后,利用ev_timer_again來(lái)高效地重新設(shè)置超時(shí)時(shí)間。
如果你確實(shí)希望對(duì)于after>0的定時(shí)器也每次new一個(gè)Timer來(lái)處理,那也可以做到,這就要用到前面提到的process.binding方法來(lái)獲取timer模塊,一個(gè)例子:
var Timer = process.binding('timer').Timer;
var timer=new Timer();
timer.callback=function(){
console.log("callback called");
};
timer.start(1000,0);
timer.callback 設(shè)定timer的回調(diào)函數(shù),當(dāng)超時(shí)的時(shí)候調(diào)用。
timer.start(after,repeat) 啟動(dòng)定時(shí)器,在after毫秒之后調(diào)用超時(shí)回調(diào);如果repeat==0,則自動(dòng)停止定時(shí)器;如果repeat>0,則在repeat毫秒之后再次調(diào)用callback,以repeat毫秒為間隔不斷重復(fù)下去。
ps.這篇blog剛好是我的第499篇blog,不出意外,第500篇還是繼續(xù)介紹node.js。