亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入理解Node.js中的進程管理

2019-11-19 17:10:34
字體:
來源:轉載
供稿:網友

前言

本文主要對 Node.js 中進程管理相關的東西做一個簡單介紹,包括 process 對象child_process 模塊cluster 模塊,詳細的 API 可以查看官方文檔,下面來看看詳細的介紹吧。

Process 對象

process 是 Node.js 的一個全局對象,可以在任何地方直接使用而不需要 require 命令加載。process 對象提供了 當前 node 進程 的命令行參數、標準輸入輸出、運行環境和運行狀態等信息。

常用屬性

argv

process.argv 屬性返回一個數組,第一個元素是 node,第二個元素是腳本文件名稱,其余成員是腳本文件的參數。

$ node process-2.js one two=three four0: /usr/local/bin/node1: /Users/mjr/work/node/process-2.js2: one3: two=three4: four

env

process.env 返回一個對象,包含了當前 Shell 的所有環境變量,比如:

{ TERM: 'xterm-256color', SHELL: '/bin/zsh', USER: 'huangtengfei', PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin', PWD: '/Users/huangtengfei', HOME: '/Users/huangtengfei'}

這個屬性通常的使用場景是,新建一個 NODE_ENV 變量,用來確定當前所處的開發階段,生成階段設為 production,開發階段設為 develop ,然后在腳本中讀取 process.env.NODE_ENV 再做相應處理即可。

運行腳本時可以這樣改變環境變量:

$ export NODE_ENV=production && node app.js# 或者$ NODE_ENV=production node app.js

stdin/stdout

process.stdin 指向標準輸入(鍵盤到緩沖區里的東西),返回一個可讀的流:

process.stdin.setEncoding('utf8');process.stdin.on('readable', () => { var chunk = process.stdin.read(); if (chunk !== null) { process.stdout.write(`data: ${chunk}`); }});process.stdin.on('end', () => { process.stdout.write('end');});

process.stdout 指向標準輸出(向用戶顯示內容),返回一個可寫的流:

const fs = require('fs');fs.createReadStream('wow.txt') .pipe(process.stdout);

常用方法

cwd()

process.cwd() 返回運行 Node 的工作目錄(絕對路徑),比如在目錄 /Users/huangtengfei/abc 下執行 node server.js,那么 process.cwd() 返回的就是 /Users/huangtengfei/abc。

另一個常用的獲取路徑的方法是 __dirname,它返回的是執行文件時該文件在文件系統中所在的目錄。注意 process.cwd() __dirname 的不同,前者是進程發起時的位置,后者是腳本的位置,兩者可能不一致。

on()

process 對象部署了 EventEmitter 接口,可以使用 process.on() 方法監聽各種事件,并指定回調函數。比如監聽到系統發出進程終止信號時關閉服務器然后退出進程:

process.on('SIGTERM', function () { server.close(function () { process.exit(0); });});

exit()

process.exit() 會讓 Node 立即終止當前進程(同步),參數為一個退出狀態碼,0 表示成功,大于 0 的任意整數表示失敗。

kill()

process.kill() 用來對特定 id 的進程(process.pid)發送信號,默認為 SIGINT 信號。比如殺死當前進程:

process.kill(process.pid, 'SIGTERM');

雖然名字叫 kill ,但其實 process.kill() 只是負責發送信號,具體發送完信號之后這個怎么處理這個指定進程,取決于信號種類和接收到這個信號之后做了什么操作(比如 process.exit() 或者只是 console.log('Ignored this single'))。

Child Process 模塊

child_process 模塊用于創建和控制子進程,其中最核心的是 .spawn() ,其他 API 算是針對特定場景對它的封裝。使用前要先 require 進來:

const cp = require('child_process');

exec(command[, options][, callback])

exec() 方法用于執行 shell 命令,它的第一個參數是字符串形式的命令,第二個參數(可選)用來指定子進程運行時的定制化操作,第三個參數(可選)用來設置執行完命令的回調函數。比如在一個特定目錄 /Users/huangtengfei/abc 下執行 ls -l 命令:

cp.exec('ls -l', { cwd: '/Users/huangtengfei/abc'}, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`);})

spawn(command[, args][, options])

spawn() 用來創建一個子進程執行特定命令,與 exec() 的區別是它沒有回調函數,只能通過監聽事件來獲取運行結果,它適用于子進程長時間運行的情況,可以實時輸出結果。

const ls = cp.spawn('ls', ['-l']);ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`);});ls.stderr.on('data', (data) => { console.log(`stderr: ${data}`);});ls.on('close', (code) => { console.log(`child process exited with code $[code]`);});

使用 spawn 可以實現一個簡單的守護進程,在工作進程不正常退出時重啟工作進程:

/* daemon.js */function spawn(mainModule) { const worker = cp.spawn('node', [ mainModule ]); worker.on('exit', function (code) {  if (code !== 0) {   spawn(mainModule);  } });}spawn('worker.js');

fork(modulePath[, args][, options])

fork() 用來創建一個子進程執行 node 腳本,fork('./child.js') 相當于 spawn('node', ['./child.js']) , 區別在于 fork 會在父子進程之間建立一個通信管道(fork() 的返回值),用于進程間通信。對該通信管道對象可以監聽 message 事件,用來獲取子進程返回的信息,也可以向子進程發送信息。

/* main.js */const proc = cp.fork('./child.js');proc.on('message', function(msg) { console.log(`parent got message: ${msg}`);});proc.send({ hello: 'world' });/* child.js */process.on('message', function(msg) { console.log(`child got message: ${msg}`);});process.send({ foo: 'bar' });

Cluster 模塊

Node.js 默認單進程執行,但這樣就無法利用多核計算機的資源,cluster 模塊的出現就是為了解決這個問題的。在開發服務器程序時,可以通過 cluster 創建一個主進程和多個 worker 進程,讓每個 worker 進程運行在一個核上,統一通過主進程監聽端口和分發請求。

const cluster = require('cluster');const http = require('http');const numCPUs = require('os').cpus().length;if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); });} else { // Workers can share any TCP connection // In this case it is an HTTP server http.createServer((req, res) => { res.writeHead(200); res.end('hello world/n'); }).listen(8000); console.log(`Worker ${process.pid} started`);}

常用屬性和方法

isMaster/isWorker

cluster.isMaster 用來判斷當前進程是否是主進程,cluster.isWorker 用來判斷當前進程是否是工作進程,兩者返回的都是布爾值。

workers

cluster.workers 是一個包含所有 worker 進程的對象,key 為 worker.id,value 為 worker 進程對象。

// 遍歷所有 workersfunction eachWorker(callback) { for (const id in cluster.workers) { callback(cluster.workers[id]); }}eachWorker((worker) => { worker.send('big announcement to all workers');});

fork([env])

cluster.fork() 方法用來新建一個 worker 進程,默認上下文復制主進程,只有主進程可調用。

常用事件

listening

在工作進程調用 listen 方法后,會觸發一個 listening 事件,這個事件可以被 cluster.on('listening') 監聽。

比如每當一個 worker 進程連進來時,輸出一條 log 信息:

cluster.on('listening', (worker, address) => { console.log( `A worker is now connected to ${address.address}:${address.port}`);});

exit

在工作進程掛掉時,會觸發一個 exit 事件,這個事件可以被 cluster.on('exit') 監聽。

比如自動重啟 worker:

cluster.on('exit', (worker, code, signal) => { console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code); cluster.fork();});

worker 對象

worker 對象是 cluster.fork() 的返回值,代表一個 worker 進程。

worker.id

worker.id 是當前 worker 的唯一標識,也是保存在 cluster.workers 中的 key 值。

worker.process

所有的 worker 進程都是通過 child_process.fork() 生成的,這個進程對象保存在 worker.process 中。

worker.send()

worker.send() 用在主進程給子進程發送消息,在子進程中,使用 process.on() 監聽消息并使用 process.send() 發送消息。

if (cluster.isMaster) { const worker = cluster.fork(); worker.send('hi there');} else if (cluster.isWorker) { process.on('message', (msg) => { process.send(msg); });}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产suv精品一区二区三区88区| 粗暴蹂躏中文一区二区三区| 中文字幕日韩欧美| 国产一区二区香蕉| 欧美日韩一区二区免费视频| 色偷偷88888欧美精品久久久| 日韩欧美中文免费| 亚洲第一精品久久忘忧草社区| 在线观看久久av| 日韩在线资源网| 国产成人在线亚洲欧美| 欧美丝袜第一区| 国产一区二区三区直播精品电影| 欧美孕妇与黑人孕交| 日韩精品免费综合视频在线播放| 欧美国产高跟鞋裸体秀xxxhd| 欧美激情国产日韩精品一区18| 欧美激情免费观看| 久久精品小视频| 中文字幕日韩精品有码视频| 黑人极品videos精品欧美裸| 国产精品99久久99久久久二8| 视频在线观看99| 国产精品久久久久久久久| 欧美日韩美女视频| 97精品国产91久久久久久| 欧美激情一区二区三级高清视频| 日本免费在线精品| 亚洲高清不卡av| 免费99精品国产自在在线| 亚洲国产日韩精品在线| 日韩大陆欧美高清视频区| 欧美性猛交xxxx| 色偷偷亚洲男人天堂| 一区二区亚洲精品国产| 亚洲第一精品久久忘忧草社区| 欧美在线性爱视频| 亚洲精品电影网| 国产一区二区三区网站| 久青草国产97香蕉在线视频| 国产日韩专区在线| 欧美一区二区影院| 欧美最猛黑人xxxx黑人猛叫黄| 欧美午夜丰满在线18影院| 欧美国产极速在线| 91亚洲精品一区二区| 69视频在线免费观看| 久久精品99无色码中文字幕| 狠狠综合久久av一区二区小说| 欧美午夜精品久久久久久浪潮| 欧美劲爆第一页| 精品成人乱色一区二区| 91社影院在线观看| 亚洲最大福利网| 欧美色xxxx| 亚洲欧洲日产国码av系列天堂| 国产成人高潮免费观看精品| 日韩成人在线视频| www国产亚洲精品久久网站| 欧美激情乱人伦| 国产精品9999| 亚洲精品国产美女| 国产一区二区三区在线看| 精品美女久久久久久免费| 国产999视频| 91国自产精品中文字幕亚洲| 亚洲第一区中文99精品| 欧美最猛性xxxxx亚洲精品| 亚洲欧美国产高清va在线播| 中文字幕亚洲综合久久筱田步美| 国产伊人精品在线| 超碰91人人草人人干| 成人免费在线网址| 欧美日韩一区免费| 亚洲最新中文字幕| 日韩中文字幕第一页| 国产亚洲人成网站在线观看| 久久久久久尹人网香蕉| 91精品美女在线| 国产精品a久久久久久| 欧美肥老太性生活视频| 日韩av在线影视| 自拍偷拍亚洲精品| 中文字幕九色91在线| 亚洲成人精品视频在线观看| 日韩美女免费视频| 久久久伊人日本| 久久久久久久香蕉网| 日本电影亚洲天堂| 国产精品小说在线| 中国人与牲禽动交精品| 国产在线视频一区| 国产精品久久久久影院日本| 伊人精品在线观看| 日韩免费在线免费观看| 国产亚洲成av人片在线观看桃| 亚洲高清在线观看| 欧美黄色片免费观看| 57pao精品| 亚洲自拍偷拍福利| 亚洲香蕉在线观看| 亚洲欧美在线播放| 亚洲国产精品久久精品怡红院| 亚洲一区二区久久久久久| 日韩中文综合网| 欧美伦理91i| 精品视频在线观看日韩| 亚洲精品美女久久久久| 欧美性视频精品| 日本欧美一二三区| 性色av一区二区三区| 欧美精品在线观看91| 欧美激情性做爰免费视频| 最新中文字幕亚洲| 九九久久久久久久久激情| 91av国产在线| 国产精品av在线播放| 亚洲午夜小视频| 国产一区二区三区18| 久久久亚洲国产天美传媒修理工| 欧美成人免费va影院高清| 成人亚洲综合色就1024| 国产精品福利网站| 亚洲一区二区精品| 亚洲嫩模很污视频| 亚洲激情视频在线| 亚洲午夜小视频| 在线观看中文字幕亚洲| 91美女片黄在线观看游戏| 欧美专区在线播放| 日韩av在线免费看| 日韩电影免费在线观看中文字幕| 日本成人黄色片| 日韩在线不卡视频| 国产这里只有精品| 欧美超级乱淫片喷水| 成人激情视频免费在线| 日韩视频第一页| 欧美一区视频在线| 亚洲第一中文字幕| 亚洲精品aⅴ中文字幕乱码| 欧美电影在线观看完整版| 91欧美精品午夜性色福利在线| 丰满岳妇乱一区二区三区| 91亚洲精品久久久| 久久久久久国产精品三级玉女聊斋| 成人美女免费网站视频| 亚洲精品福利视频| 国产主播喷水一区二区| 欧美午夜性色大片在线观看| 91精品国产91久久久久久最新| 狠狠做深爱婷婷久久综合一区| 国产精品精品视频| 午夜欧美不卡精品aaaaa| 欧美亚洲视频在线观看| 亚洲精品资源美女情侣酒店| 26uuu国产精品视频| 国产精品日韩欧美大师| 欧美激情成人在线视频| 日韩激情视频在线| 九九久久久久久久久激情| 日韩在线中文字幕| 奇门遁甲1982国语版免费观看高清| 亚洲国产成人爱av在线播放|