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