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