国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解node child_process模塊學習筆記

2024-05-06 15:22:23
字體:
來源:轉載
供稿:網友

NodeJs是一個單進程的語言,不能像Java那樣可以創建多線程來并發執行。當然在大部分情況下,NodeJs是不需要并發執行的,因為它是事件驅動性永不阻塞。但單進程也有個問題就是不能充分利用CPU的多核機制,根據前人的經驗,可以通過創建多個進程來充分利用CPU多核,并且Node通過了child_process模塊來創建完成多進程的操作。

child_process模塊給予node任意創建子進程的能力,node官方文檔對于child_proces模塊給出了四種方法,映射到操作系統其實都是創建子進程。但對于開發者而已,這幾種方法的api有點不同

child_process.exec(command[, options][, callback]) 啟動子進程來執行shell命令,可以通過回調參數來獲取腳本shell執行結果

child_process.execfile(file[, args][, options][, callback]) 與exec類型不同的是,它執行的不是shell命令而是一個可執行文件

child_process.spawn(command[, args][, options])僅僅執行一個shell命令,不需要獲取執行結果

child_process.fork(modulePath[, args][, options])可以用node執行的.js文件,也不需要獲取執行結果。fork出來的子進程一定是node進程

exec()與execfile()在創建的時候可以指定timeout屬性設置超時時間,一旦超時會被殺死

如果使用execfile()執行可執行文件,那么頭部一定是#!/usr/bin/env node

進程間通信

node 與 子進程之間的通信是使用IPC管道機制完成。如果子進程也是node進程(使用fork),則可以使用監聽message事件和使用send()來通信。

main.js

var cp = require('child_process');//只有使用fork才可以使用message事件和send()方法var n = cp.fork('./child.js');n.on('message',function(m){ console.log(m);})n.send({"message":"hello"});

child.js

var cp = require('child_process');process.on('message',function(m){ console.log(m);})process.send({"message":"hello I am child"})

父子進程之間會創建IPC通道,message事件和send()便利用IPC通道通信.

句柄傳遞

學會如何創建子進程后,我們創建一個HTTP服務并啟動多個進程來共同做到充分利用CPU多核。

worker.js

var http = require('http');http.createServer(function(req,res){ res.end('Hello,World'); //監聽隨機端口}).listen(Math.round((1+Math.random())*1000),'127.0.0.1');

main.js

var fork = require('child_process').fork;var cpus = require('os').cpus();for(var i=0;i<cpus.length;i++){ fork('./worker.js');}

上述代碼會根據你的cpu核數來創建對應數量的fork進程,每個進程監聽一個隨機端口來提供HTTP服務。

上述就完成了一個典型的Master-Worker主從復制模式。在分布式應用中用于并行處理業務,具備良好的收縮性和穩定性。這里需要注意,fork一個進程代價是昂貴的,node單進程事件驅動具有很好的性能。此例的多個fork進程是為了充分利用CPU的核,并非解決并發問題.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 元谋县| 丰台区| 凌海市| 东港市| 区。| 岳阳市| 香河县| 兰溪市| 日照市| 运城市| 开鲁县| 民县| 渭南市| 阿勒泰市| 黔东| 云南省| 西吉县| 耒阳市| 泗水县| 昌都县| 仙桃市| 扎鲁特旗| 天峻县| 马关县| 通许县| 清涧县| 锡林郭勒盟| 陆丰市| 临夏县| 四子王旗| 交口县| 康平县| 农安县| 丽江市| 荥经县| 福鼎市| 江川县| 崇阳县| 泸水县| 凯里市| 共和县|