最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs極簡(jiǎn)入門(mén)教程(三):進(jìn)程

 更新時(shí)間:2014年10月27日 08:58:57   投稿:junjie  
這篇文章主要介紹了Nodejs極簡(jiǎn)入門(mén)教程(三):進(jìn)程,本文講解了Node 進(jìn)程間通信、cluster 模塊等內(nèi)容,需要的朋友可以參考下

Node 雖然自身存在多個(gè)線(xiàn)程,但是運(yùn)行在 v8 上的 JavaScript 是單線(xiàn)程的。Node 的 child_process 模塊用于創(chuàng)建子進(jìn)程,我們可以通過(guò)子進(jìn)程充分利用 CPU。范例:

復(fù)制代碼 代碼如下:

var fork = require('child_process').fork;
// 獲取當(dāng)前機(jī)器的 CPU 數(shù)量
var cpus = require('os').cpus();
for (var i = 0; i < cpus.length; i++) {
    // 生成新進(jìn)程
    fork('./worker.js');
}

這里了解一下包括 fork 在內(nèi)的幾個(gè)進(jìn)程創(chuàng)建方法:

1.spawn(command, [args], [options]),啟動(dòng)一個(gè)新進(jìn)程來(lái)執(zhí)行命令 command,args 為命令行參數(shù)
2.exec(command, [options], callback),啟動(dòng)一個(gè)新進(jìn)程來(lái)執(zhí)行命令 command,callback 用于在進(jìn)程結(jié)束時(shí)獲取標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出,以及錯(cuò)誤信息
3.execFile(file, [args], [options], [callback]),啟動(dòng)一個(gè)新進(jìn)程來(lái)執(zhí)行可執(zhí)行文件 file,callback 用于在進(jìn)程結(jié)束時(shí)獲取標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出,以及錯(cuò)誤信息
4.fork(modulePath, [args], [options]),啟動(dòng)一個(gè)新進(jìn)程來(lái)執(zhí)行一個(gè) JavaScript 文件模塊,這時(shí)候創(chuàng)建的是 Node 子進(jìn)程

Node 進(jìn)程間通信

父進(jìn)程

復(fù)制代碼 代碼如下:

// parent.js
var fork = require('child_process').fork;
// fork 返回子進(jìn)程對(duì)象 n
var n = fork('./child.js');
// 處理事件 message
n.on('message', function(m) {
    // 收到子進(jìn)程發(fā)送的消息
    console.log('got message: ' + m);
});
 
// 向子進(jìn)程發(fā)送消息
n.send({hello: 'world'});

子進(jìn)程

復(fù)制代碼 代碼如下:

// child.js
// 處理事件 message
process.on('message', function(m) {
    console.log('got message: ' + m);
});
 
// process 存在 send 方法,用于向父進(jìn)程發(fā)送消息
process.send({foo: 'bar'});

需要注意的是,這里的 send 方法是同步的,因此不建議用于發(fā)送大量的數(shù)據(jù)(可以使用 pipe 來(lái)代替,詳細(xì)見(jiàn):http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_options)。
特殊的情況,消息中 cmd 屬性值包含 NODE_ 前綴(例如:{cmd: ‘NODE_foo'} 消息),那么此消息不會(huì)被提交到 message 事件(而是 internalMessage 事件),它們被 Node 內(nèi)部使用。

send 方法的原型為:

復(fù)制代碼 代碼如下:

send(message, [sendHandle])

這里,sendHandle(handle)可以被用于發(fā)送:

1.net.Native,原生的 C++ TCP socket 或者管道
2.net.Server,TCP 服務(wù)器
3.net.Socket,TCP socket
4.dgram.Native,原生的 C++ UDP socket
5.dgram.Socket,UDP socket

send 發(fā)送 sendHandle 時(shí)實(shí)際上不是(也不能)直接發(fā)送 JavaScript 對(duì)象,而是發(fā)送文件描述符(最終以 JSON 字符串發(fā)送),其他進(jìn)程能夠通過(guò)這個(gè)文件描述符還原出對(duì)應(yīng)對(duì)象。

現(xiàn)在看一個(gè)例子:

父進(jìn)程

復(fù)制代碼 代碼如下:

// parent.js
var fork = require('child_process').fork;
 
var n = fork('./child.js');
 
var server = require('net').createServer();
server.listen(7000, function() {
    // 發(fā)送 TCP server 到子進(jìn)程
    n.send('server', server);
}).on('connection', function() {
    console.log('connection - parent');
});

子進(jìn)程

復(fù)制代碼 代碼如下:

process.on('message', function(m, h) {
    if (m === 'server') {
        h.on('connection', function() {
            console.log('connection - child');
        });
    }
});

通過(guò)端口 7000 訪(fǎng)問(wèn)此程序,得到輸出可能為 connection – parent 也可能得到輸出 connection – child。這里子進(jìn)程和父進(jìn)程同時(shí)監(jiān)聽(tīng)了端口 7000。通常來(lái)說(shuō),多個(gè)進(jìn)程監(jiān)聽(tīng)同一個(gè)端口會(huì)引起 EADDRINUSE 的異常,而此例的情況是,不同的兩個(gè)進(jìn)程使用了相同的文件描述符,且 Node 底層在監(jiān)聽(tīng)端口時(shí)對(duì) socket 設(shè)置了 SO_REUSEADDR 選項(xiàng),這使得此 socket 可以在不同的進(jìn)程間復(fù)用。在多個(gè)進(jìn)程監(jiān)聽(tīng)同一個(gè)端口時(shí),同一時(shí)刻文件描述符只能被一個(gè)進(jìn)程使用,這些進(jìn)程對(duì) socket 的使用是搶占式的。

cluster 模塊

在 Node 的 v0.8 新增了 cluster 模塊,通過(guò) cluster 模塊能夠輕松的在一臺(tái)物理機(jī)器上構(gòu)建一組監(jiān)聽(tīng)相同端口的進(jìn)程。范例:

復(fù)制代碼 代碼如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
 
// 檢查進(jìn)程是否是 master 進(jìn)程
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; ++i)
        // 生成新的 worker 進(jìn)程(只有 master 進(jìn)程才可以調(diào)用)
        cluster.fork();
 
    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end('hello world\n');
    }).listen(8000);
}

我們?cè)?worker 進(jìn)程中調(diào)用 listen 方法,監(jiān)聽(tīng)請(qǐng)求將會(huì)傳遞給 master 進(jìn)程。如果 master 進(jìn)程已經(jīng)存在一個(gè)正在監(jiān)聽(tīng)的 server 符合 worker 進(jìn)程的要求,那么此 server 的 handle 將會(huì)傳遞給 worker,如果不存在,master 進(jìn)程則會(huì)創(chuàng)建一個(gè),然后將 handle 傳遞給 worker 進(jìn)程。

更多詳細(xì)的關(guān)于 cluster 的文檔:http://www.nodejs.org/api/cluster.html

相關(guān)文章

  • Windows系統(tǒng)中安裝nodejs圖文教程

    Windows系統(tǒng)中安裝nodejs圖文教程

    這篇文章主要介紹了Windows系統(tǒng)中安裝nodejs圖文教程,本文分解了安裝中的各個(gè)步驟并給出圖文說(shuō)明,需要的朋友可以參考下
    2015-02-02
  • Node.js用readline模塊實(shí)現(xiàn)輸入輸出

    Node.js用readline模塊實(shí)現(xiàn)輸入輸出

    在學(xué)C++的時(shí)候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同C++和Java的標(biāo)準(zhǔn)輸入,當(dāng)然,是用JavaScript實(shí)現(xiàn)的,它就是Readline模塊。下面這篇文章就給大家詳細(xì)介紹一下readline模塊,來(lái)實(shí)現(xiàn)Node.js的控制臺(tái)輸入輸出。有需要的可以參考借鑒。
    2016-12-12
  • 淺談node的事件機(jī)制

    淺談node的事件機(jī)制

    本篇文章主要介紹了node的事件機(jī)制,本文通過(guò)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的、具有發(fā)布/訂閱模式的事件機(jī)制,以此來(lái)理清EventEmitter類(lèi)的實(shí)現(xiàn)思路,有興趣的可以了解一下
    2017-10-10
  • nodejs實(shí)現(xiàn)遍歷文件夾并統(tǒng)計(jì)文件大小

    nodejs實(shí)現(xiàn)遍歷文件夾并統(tǒng)計(jì)文件大小

    這篇文章主要介紹了nodejs實(shí)現(xiàn)遍歷文件夾并統(tǒng)計(jì)文件大小,下面使用nodejs的遍歷文件夾文件內(nèi)容,并且讀取所有的文件,并采取排序往大到小的順序進(jìn)行輸出,需要的朋友可以參考下
    2015-05-05
  • Node.js查找當(dāng)前目錄下文件夾實(shí)例代碼

    Node.js查找當(dāng)前目錄下文件夾實(shí)例代碼

    本篇文章主要介紹了Node.js查找當(dāng)前目錄下文件夾實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-03-03
  • 深入理解Node.js中通用基礎(chǔ)設(shè)計(jì)模式

    深入理解Node.js中通用基礎(chǔ)設(shè)計(jì)模式

    大家在談到設(shè)計(jì)模式時(shí)最先想到的就是 singletons, observers(觀察者) 或 factories(工廠方法)。本文重點(diǎn)給大家介紹Node.JS一些基礎(chǔ)模式的實(shí)現(xiàn)方法,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2017-09-09
  • Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容

    Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容

    這篇文章主要介紹了Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2019-08-08
  • 在Node.js中使用TypeScript的方法示例

    在Node.js中使用TypeScript的方法示例

    在前端開(kāi)發(fā)中,隨著TypeScript的不斷普及,越來(lái)越多的開(kāi)發(fā)者使用TypeScript進(jìn)行開(kāi)發(fā),然而,在后端開(kāi)發(fā)中,在Node.js中使用 TypeScript還是相對(duì)較少見(jiàn)的,這篇文章將介紹如何在Node.js中配置TypeScript ,以及如何使用TypeScript來(lái)開(kāi)發(fā)高質(zhì)量的應(yīng)用程序
    2023-06-06
  • nodejs實(shí)現(xiàn)簡(jiǎn)單的gulp打包

    nodejs實(shí)現(xiàn)簡(jiǎn)單的gulp打包

    因?yàn)橹耙恢庇腥私o我推薦gulp,說(shuō)他這里好哪里好的。實(shí)際上對(duì)我來(lái)說(shuō)夠用就行。grunt熟悉以后實(shí)際上他的配置也不難,說(shuō)到效率的話(huà)確實(shí)是個(gè)問(wèn)題,尤其項(xiàng)目大了以后,目前位置遇到的項(xiàng)目都還可以忍受。不過(guò)不管怎么說(shuō),需要親自用過(guò)gulp之后才能品評(píng)他和grunt之間的優(yōu)劣。
    2017-12-12
  • vscode執(zhí)行npm時(shí)的一些錯(cuò)誤以及處理辦法

    vscode執(zhí)行npm時(shí)的一些錯(cuò)誤以及處理辦法

    在前端開(kāi)發(fā)過(guò)程中,npm的使用是少不了的,所以需要知道基本的操作使用,并且了解常見(jiàn)的異常情況處理,下面這篇文章主要給大家介紹了關(guān)于vscode執(zhí)行npm時(shí)的一些錯(cuò)誤以及處理辦法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

吉木乃县| 北碚区| 墨竹工卡县| 涿州市| 长阳| 栾川县| 阿尔山市| 辰溪县| 大名县| 汝阳县| 沙湾县| 会昌县| 富平县| 堆龙德庆县| 砚山县| 阜平县| 桓台县| 邯郸县| 瓦房店市| 武宁县| 英山县| 固阳县| 大埔县| 拜城县| 正宁县| 建平县| 平泉县| 平原县| 茶陵县| 格尔木市| 樟树市| 枣阳市| 保亭| 五峰| 宕昌县| 友谊县| 周至县| 玉林市| 株洲市| 兰西县| 荃湾区|