在nodejs中只支援單執行緒。但是在應用程式中,如果只使用單執行緒進行操作,從接受請求開始到返回響應為止的這一段時間內可能存在很長的一段等待時間。在這種場合下如果能使用多程序,則可以為每個請求分配乙個程序,從而更好的使用伺服器端的cpu資源。為了實現多程序處理,nodejs提供了child_process
模組於cluster
模組.其中child_process
模組用於實現在node.js
應用程式中開啟多個子程序並在各個子程序中執行不同命令或執行node.js
模組檔案。cluster
模組用於實現node.js應用程式中開啟多個子程序,在每個子程序中執行乙個node.js
應用程式的副本
process
不是內建模組,而是乙個全域性物件,因此在任何地方都可以直接使用
屬性列表:
execpath
:屬性值用來執行應用程式的可執行檔案的絕對路徑。
version
:屬性值為node.js的版本號
platform
:屬性值是當前執行node的平台是linux還是windows
ar**
:屬性值為乙個陣列,其中包含了執行node.js應用程式中所有的命令列引數。陣列的第一元素為node 第二個元素為執行的指令碼檔名 從第三個元素開始為其他的命令列引數
process.ar**.foreach(function(val,index,array))
env
:此屬性值為乙個物件 其中包含了執行node程式作業系統的環境資訊。
config
:詞屬性值為乙個物件
【執行應用程式可執行檔案的配置項】
pid
:當前應用程式程序的pid
title
:應用程式的視窗標題
stdin
:輸入流物件
process.stdin.resume();
process.stdin.on('data',function(chunk))
列印程序接受到的資料
sdout
:輸出流物件
process.memoryusage()
獲取執行node.js應用程式的程序記憶體使用量
res
:屬性值是乙個整數 表示執行node.js應用程式的程序的記憶體消耗量
heaptotal
:表示v8所分配的記憶體量單位為位元組
heapused
表示v8所消耗的記憶體量 單位為位元組
在nodejs中只使用乙個執行緒來執行所有的操作。因此如果在應用程式中存在某個操作需要大量消耗cpu資源狀況,則其他操作都會受到一定影響。例如當伺服器正在執行乙個非常消耗cpu資源的操作,則在該操作執行之後接受到客戶端請求都需要等待該操作執行完畢後才能被處理。
近些年來,伺服器一般都開始使用多核cpu或者多cpu,許多伺服器應用程式都開始依靠多執行緒或者多程序的機制來處理這些請求,以便可以更好的利用這些cpu的資源。在node.js中,同樣提供乙個child_process模組。通過該模組的使用,在node.js應用程式的主程序之後可以開啟多個子程序。在多個子程序之間可以共享記憶體空間,可以通過子程序之間的相互通訊來實現資訊的交換。
子程序 模組child_process
方法一
child_process.spawn(command,[args],[options])
command
為必須指定的引數 值為字串 用於指定需要執行的命令
args
為陣列 存放指定命令時需要使用的引數
options
開啟子程序使用的選項
spawn
方法返回乙個隱式建立的代表子程序的childprocess
test1.js
process.stdout.write("子程序的工作目錄是:"+process.cwd());
process.ar**.foreach(function(val,index,array))
test2.js
var fs=require('fs');
var out=fs.createwritestream('./message.txt');
process.stdin.on('data',function(data))
process.stdin.on('end',function(data))
child.js
var cp=require('child_process');
var sp1=cp.spawn('node',['test1.js','one','two','three','four']);
console.log(sp1);
var sp2=cp.spawn('node',['test2.js',]);
sp1.stdout.on('data',function(data));
sp1.on('exit',function(code,signal));
exec()
方法開啟子程序在child_process
模組中可以使用exec
方法開啟乙個用於執行某個命令的子程序並快取子程序的輸出結果
child_process.exec(command,[options],[callbac])
command
命令
options 設定選項 例如設定當前目錄 cwd 設定編碼encoding
function(error,stdout,stderr)
exec
方法返回乙個隱式建立的代表子程序的childprocess
exec
方法與spawn
方法的區別:
spawn
方法可以在父程序中實時接受子程序中的輸出流資料 因此是乙個非同步方法
exec
方法 父程序必須等待子程序的資料流全部快取完畢後才能接受這些資料
test1.js
process.stdout.write("子程序的工作目錄是:"+process.cwd());
process.ar**.foreach(function(val,index,array))
test3.js
var fs=require('fs');
var out=fs.createwritestream('./mess.txt');
process.stdin.on('data',function(data))
exec.js
var cp=require('child_process');
var sp1=cp.exec('node test1.js one two three four',function(err,stdout,stderr)else
});var sp2=cp.exec('node test3.js',function(err,stdou,stderr));
如何 停止node程序?
events.js 85 throw er unhandled error event error listen eaddrinuse at exports.errnoexception util.js 746 11 at server.listen2 net.js 1146 14 at liste...
Node 事件迴圈和非同步IO 程序和執行緒的關係
會有乙個呼叫執行棧,只要棧為空的時候才會執行巨集任務微任務。並且執行任何乙個巨集任務之前,會檢視微任務佇列是否有任務需要執行,也就是說巨集任務的函式裡如果有微任務的入列,執行下乙個巨集任務之前會除了執行完當前巨集任務的主線程 後再執行優先把剛剛加入微任務佇列的微任務 常見的巨集任務 ajax,dom...
程序,執行緒池,執行緒
執行緒池的五個狀態 running 可以接受新的任務,也可以處理阻塞佇列裡的任務 shutdown 不能接受新的任務,可以處理阻塞佇列裡的任務,running 狀態下呼叫 shutdown 函式會裝變成 shutdown 狀態stop 不能接受新的任務,也不能處理阻塞佇列裡的任務,running 狀...