摘要:多進(jìn)程單線(xiàn)程模式運(yùn)行的,使用事件處理并發(fā)。使用子進(jìn)程的執(zhí)行命令緩存子進(jìn)程的輸出。子進(jìn)程退出進(jìn)程執(zhí)行。子進(jìn)程退出子進(jìn)程退出執(zhí)行異步相當(dāng)魔幻飄忽不定綁定兩個(gè)事件設(shè)置退出事件子進(jìn)程退出進(jìn)程執(zhí)行。
Node.js多進(jìn)程
Node.js單線(xiàn)程模式運(yùn)行的,使用事件處理并發(fā)。
使用子進(jìn)程的執(zhí)行命令,緩存子進(jìn)程的輸出。并將子進(jìn)程的輸出以回調(diào)函數(shù)參數(shù)的形式進(jìn)行返回
process.argv() 當(dāng)參數(shù)為0時(shí)是node的文件絕對(duì)地址
當(dāng)參數(shù)為1時(shí)是該文件的絕對(duì)地址
當(dāng)參數(shù)為2時(shí)是命令第一個(gè)參數(shù)。
child_process.exec回調(diào)函數(shù)有三個(gè)選項(xiàng),error, stdout, stderr
error 為程序執(zhí)行的錯(cuò)誤,正常執(zhí)行會(huì)返回一個(gè)null
stdout 為程序的正常輸出
stderr 為程序錯(cuò)誤輸出
/*master.js*/ const fs = require("fs"); const child_process = require("child_process"); for(var i=0; i<3; i++) { var count = 0; var workerProcess = child_process.exec("node support.js " +i, function (err, std, stderr) { if (err) { console.log(err.stack); console.log("Error code: "+err.code); console.log("Signal received: "+err.signal); } console.log("---------------------"); console.log(i); console.log("stdout: " + std); console.log("stderr: " + stderr); }); workerProcess.on("exit", function (code) { console.log("子進(jìn)程已退出,退出碼 "+code); console.log("執(zhí)行順序" + count++); }); }
/*support.js*/ /*support.js*/ console.log("進(jìn)程 " + process.argv[2] + " 執(zhí)行。" );
執(zhí)行結(jié)果
PS C:UsersmingmDesktop est> node master.js 子進(jìn)程已退出,退出碼 0 執(zhí)行順序0 --------------------- 3 stdout: 進(jìn)程 0 執(zhí)行。 stderr: 子進(jìn)程已退出,退出碼 0 執(zhí)行順序1 --------------------- 3 stdout: 進(jìn)程 1 執(zhí)行。 stderr: 子進(jìn)程已退出,退出碼 0 執(zhí)行順序2 --------------------- 3 stdout: 進(jìn)程 2 執(zhí)行。 stderr: PS C:UsersmingmDesktop est>
node.js的執(zhí)行為異步執(zhí)行,導(dǎo)致先循環(huán)3次,每次提交。
所以輸出i的值全為3
由于先運(yùn)行子進(jìn)程,子進(jìn)程執(zhí)行完畢以后,觸發(fā)exit事件,
執(zhí)行
console.log("子進(jìn)程已退出,退出碼 "+code); console.log("執(zhí)行順序" + count++);
該兩句。
接著執(zhí)行
console.log("---------------------"); console.log(i); console.log("stdout: " + std); console.log("stderr: " + stderr);
執(zhí)行完畢。
node最大的特點(diǎn)是異步執(zhí)行。
同樣也是使用指定的命令行,創(chuàng)建新進(jìn)程。
PS C:UsersmingmDesktop est> node master.js stdout進(jìn)程 0 執(zhí)行。 stdout進(jìn)程 1 執(zhí)行。 子進(jìn)程退出0 stdout進(jìn)程 2 執(zhí)行。 子進(jìn)程退出0 子進(jìn)程退出0 PS C:UsersmingmDesktop est> node master.js stdout進(jìn)程 0 執(zhí)行。 子進(jìn)程退出0 stdout進(jìn)程 1 執(zhí)行。 stdout進(jìn)程 2 執(zhí)行。 子進(jìn)程退出0 子進(jìn)程退出0 PS C:UsersmingmDesktop est> node master.js stdout進(jìn)程 0 執(zhí)行。 stdout進(jìn)程 1 執(zhí)行。 子進(jìn)程退出0 stdout進(jìn)程 2 執(zhí)行。 子進(jìn)程退出0 子進(jìn)程退出0 PS C:UsersmingmDesktop est>
node執(zhí)行異步相當(dāng)魔幻
飄忽不定
/*master.js*/ const fs = require("fs"); const child_process = require("child_process"); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn("node", ["support.js", i]); // 綁定兩個(gè)事件 workerProcess.stdout.on("data", (data) => { console.log("stdout" + data); }); workerProcess.stderr.on("data", (data) => { console.log("stderr", + data); }); // 設(shè)置退出事件 workerProcess.on("close", (code) => { console.log("子進(jìn)程退出" + code); }); };
/*support.js*/ console.log("進(jìn)程 " + process.argv[2] + " 執(zhí)行。" );
和exec()的區(qū)別在于exec()是直接回調(diào)函數(shù),而spawn()是直接綁定事件
fork()方法PS C:UsersmingmDesktop est> node master.js 進(jìn)程 0 執(zhí)行。 進(jìn)程 1 執(zhí)行。 進(jìn)程 2 執(zhí)行。 子進(jìn)程已經(jīng)退出0 子進(jìn)程已經(jīng)退出0 子進(jìn)程已經(jīng)退出0 PS C:UsersmingmDesktop est>
const fs = require("fs"); const child_process = require("child_process"); for(var i=0; i<3; i++) { var worker_process = child_process.fork("support.js", [i]); worker_process.on("close", (code) => { console.log("子進(jìn)程已經(jīng)退出" + code); }); }
還是喜歡fork方法。fork很方便。沒(méi)有那么多的異步讓人頭疼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96429.html
摘要:在單核系統(tǒng)之上我們采用單進(jìn)程單線(xiàn)程的模式來(lái)開(kāi)發(fā)。由進(jìn)程來(lái)管理所有的子進(jìn)程,主進(jìn)程不負(fù)責(zé)具體的任務(wù)處理,主要工作是負(fù)責(zé)調(diào)度和管理。模塊與模塊總結(jié)無(wú)論是模塊還是模塊,為了解決實(shí)例單線(xiàn)程運(yùn)行,無(wú)法利用多核的問(wèn)題而出現(xiàn)的。 前言 進(jìn)程與線(xiàn)程是一個(gè)程序員的必知概念,面試經(jīng)常被問(wèn)及,但是一些文章內(nèi)容只是講講理論知識(shí),可能一些小伙伴并沒(méi)有真的理解,在實(shí)際開(kāi)發(fā)中應(yīng)用也比較少。本篇文章除了介紹概念,通過(guò)...
摘要:例如,在方法中,如果需要主從進(jìn)程之間建立管道,則通過(guò)環(huán)境變量來(lái)告知從進(jìn)程應(yīng)該綁定的相關(guān)的文件描述符,這個(gè)特殊的環(huán)境變量后面會(huì)被再次涉及到。 文:正龍(滬江網(wǎng)校Web前端工程師)本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處 之前的文章走進(jìn)Node.js之HTTP實(shí)現(xiàn)分析中,大家已經(jīng)了解 Node.js 是如何處理 HTTP 請(qǐng)求的,在整個(gè)處理過(guò)程,它僅僅用到單進(jìn)程模型。那么如何讓 Web 應(yīng)用擴(kuò)展到...
摘要:在中,只支持單線(xiàn)程。在這種場(chǎng)合下,如果能夠使用多進(jìn)程,則可以為每個(gè)請(qǐng)求分配一個(gè)進(jìn)程,從而可以更好地使用服務(wù)器端的資源。進(jìn)程進(jìn)程對(duì)象的屬性用于運(yùn)行應(yīng)用程序的可執(zhí)行文件的絕對(duì)路徑的版本號(hào)及其各依賴(lài)的版本號(hào)當(dāng)前運(yùn)行的平臺(tái)用于讀入標(biāo)準(zhǔn)輸入流的對(duì)象。 Process 在Node.js中,只支持單線(xiàn)程。但是在應(yīng)用程序中,如果只使用單線(xiàn)程進(jìn)行操作,從接收請(qǐng)求開(kāi)始到返回響應(yīng)為止的這段時(shí)間內(nèi)可能存在很長(zhǎng)...
摘要:兩個(gè)事件驅(qū)動(dòng)模型服務(wù)器平均每秒處理的請(qǐng)求數(shù)為服務(wù)器的一倍,而內(nèi)存降低了一半。事件驅(qū)動(dòng)模型的出現(xiàn),是為了解決傳統(tǒng)服務(wù)器與網(wǎng)絡(luò)工作負(fù)載的需求的不匹配,實(shí)現(xiàn)高度可伸縮服務(wù)器,并降低內(nèi)存開(kāi)銷(xiāo)。 from http://oyanglul.us 本文基本上這為兩篇文章的翻譯和整合 -...
摘要:模式,單實(shí)例多進(jìn)程,常用于多語(yǔ)言混編,比如等,不支持端口復(fù)用,需要自己做應(yīng)用的端口分配和負(fù)載均衡的子進(jìn)程業(yè)務(wù)代碼。就是我們需要一個(gè)調(diào)度者,保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...
閱讀 3579·2021-11-18 10:02
閱讀 3812·2021-09-13 10:25
閱讀 1997·2021-07-26 23:38
閱讀 2684·2019-08-30 15:44
閱讀 2419·2019-08-30 13:51
閱讀 1297·2019-08-26 11:35
閱讀 2361·2019-08-26 10:29
閱讀 3517·2019-08-23 14:56