nodejs之多程序

2021-09-30 11:49:39 字數 3116 閱讀 9565

最近感覺壓力有點大,來看看nodejs的書,好讓自己輕鬆一下。

正如標題所言,這篇文章寫的是關於nodejs程序方面的知識。眾所周知,nodejs是單執行緒的額,在程式設計方面有著得天獨厚的先天優勢,可以讓我們省去了併發程式設計所帶來的種種苦惱,基於事件驅動的它,面對著io高併發,可以做得很好,但是,有一點是出於劣勢的--------面對cpu密集型的情況,可能會導致阻塞,還會浪費空餘的cpu。是不是感到很可惜,美中不足啊。不怕不怕啦,多程序來啦!!!!

子程序間通訊

模組「child_process」可以給我們帶來多執行緒。廢話少說,**最實際

var cp = require('child_process');

var n = cp.fork('./sub.js');

n.on('message', function(data) );

n.send();

process.on('message', function(m) );

process.send();

有兩個檔案,parent.js是父程序,sub.js是被建立的子程序。意思很明顯,子程序監聽父程序發來的訊息,同時,它也主動發訊息給父程序。至於父程序的話,也是同一意圖。猜猜以上會輸出什麼,貌似令人迷惑。迷惑就對了,事實上,我也迷惑。

---------------------------------集群之路-------------------------------------

下面我們可以來模仿一下集群。乙個主程序的話,可以建立和管理眾多的子程序。乙個穩定的集群,當有任務來的時候,可以分發給自己的子程序去完成。當子程序有種種錯誤導致崩潰的時候,主程序可以讓它重啟。準確來說,是再生成另外乙個程序。下面,上**

var fork = require('child_process').fork;

var cpus = require('os').cpus();

//建立伺服器並監聽

var server = require('net').createserver();

server.listen(41234);

var workers = {};

var createworker = function() );

worker.send('server', server);

workers[worker.pid];

console.log('create worker. pid: ' +worker.pid);

};//新建好多個執行緒

for (var i =0; i

下面是子程序**

//建立伺服器

//捕獲錯誤

process.on('uncaughtexception', function(err) );

});

子程序一旦崩潰,立刻退出,父程序那邊會監測到,然後再生成乙個,保證系統的穩定。但是,我們可以發現上面**有著一點小問題。在子程序是在完全退出之後才會讓父程序另外再行動,這給我們帶來一定的延遲效果,若所有子程序都是這樣的話,到時候會沒人工作了,所以,為了杜絕此情況,我們可以讓子程序在準備退出之際,就生成另外乙個,那要怎麼做呢?很明顯,可以採用訊息通知。跟「老闆」說清楚之後才辭職,不然突然離開會讓人感覺很不好。於是乎,我們其中一段**修改如下:

//子程序

//捕獲錯誤

process.on('uncaughtexception', function(err) );

//停止接受新的連線

worker.close(function() );

});

**process.send();傳送訊息給父程序。父程序相應**修改如下:

var createworker = function() 

});//退出時記得要重啟

worker.on('exit', function() );

worker.send('server', server);

workers[worker.pid];

console.log('create worker. pid: ' +worker.pid);

};

監控子程序傳送的訊息,若是將要「離開」了,就先「招聘」乙個程序替代它。好了,事已至此,似乎已經比較穩定了。然而這裡還有乙個小小的問題。我是沒有發現的,看了書才知道,哦,有這麼一回事,真是活到老學到老。是這樣樣的,有可能我們的連線是長連線,不是http的短鏈結。等待長連線斷開可能需要較長的時間。為此,為已有的連線的斷開設定乙個超時時間是必要的,在限定的時間裡強制退出。**如下:

//捕獲錯誤

process.on('uncaughtexception', function(err) );

//停止接受新的連線

worker.close(function() );

//設定超時(5秒)

settimeout(function() , 5000);

});

限定的時間是5秒鐘,若不退出,則強制退出,不然浪費資源。

---------------------------------------------我是乙個分割線,表打我------------------------------------

好了,今天到這裡了,還有一點,cluster,這個東東,官網有詳細介紹,這裡不多說了。有點累。

總結:通過這個學習,我感覺自己的知識還是挺薄弱的。不過也好,學到不少東西。

node的單執行緒是相當薄弱的,既不能好好利用空餘的cpu,又不足夠穩定。集群就不一樣了,通過簡單的主從模式,可以提高不只是乙個檔次。每個程序有自己相應的責任,各自分工合作,並且做好,這樣,乙個個簡簡單單的東西,會變得好強大。

在現實中也一樣,團隊裡面的人各司其職,並且認真投入,往往會有意想不到的效果。

python之多程序

要讓python實現多程序 multiprocessing 我們先來了解作業系統相關知識。unix 和 linux 作業系統提供了乙個 fork 函式系統呼叫,它非常特殊。普通的函式,呼叫一它次,執行一次,但是 fork 函式呼叫一次執行兩次,因為作業系統自動把當前程序 稱為父程序 複製了乙份 稱為...

python併發之多程序

一 multiprocessing模組介紹 python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在...

python學習之多程序

在介紹多程序之前,首先介紹下作業系統獲取關於程序中的一些資訊 方法描述 os.getpid 獲取當前程序的pid os.getppid 獲取當前程序的父程序的pid 在python中,我們一般都是通過引入multiprocessing模組來實現多程序程式設計,multiprocessing模組提供了...