亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nodejs極簡入門教程(三):進程

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

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

復制代碼 代碼如下:

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

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

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

Node 進程間通信

父進程

復制代碼 代碼如下:

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

子進程

復制代碼 代碼如下:

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

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

send 方法的原型為:

復制代碼 代碼如下:

send(message, [sendHandle])

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

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

send 發(fā)送 sendHandle 時實際上不是(也不能)直接發(fā)送 JavaScript 對象,而是發(fā)送文件描述符(最終以 JSON 字符串發(fā)送),其他進程能夠通過這個文件描述符還原出對應對象。

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

父進程

復制代碼 代碼如下:

// 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 到子進程
    n.send('server', server);
}).on('connection', function() {
    console.log('connection - parent');
});

子進程

復制代碼 代碼如下:

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

通過端口 7000 訪問此程序,得到輸出可能為 connection – parent 也可能得到輸出 connection – child。這里子進程和父進程同時監(jiān)聽了端口 7000。通常來說,多個進程監(jiān)聽同一個端口會引起 EADDRINUSE 的異常,而此例的情況是,不同的兩個進程使用了相同的文件描述符,且 Node 底層在監(jiān)聽端口時對 socket 設置了 SO_REUSEADDR 選項,這使得此 socket 可以在不同的進程間復用。在多個進程監(jiān)聽同一個端口時,同一時刻文件描述符只能被一個進程使用,這些進程對 socket 的使用是搶占式的。

cluster 模塊

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

復制代碼 代碼如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
 
// 檢查進程是否是 master 進程
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; ++i)
        // 生成新的 worker 進程(只有 master 進程才可以調(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);
}

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

更多詳細的關于 cluster 的文檔:http://www.nodejs.org/api/cluster.html

相關文章

  • 基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問)

    基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問)

    Node-Red是IBM公司開發(fā)的一個可視化的編程工具,在網(wǎng)頁內(nèi)編程,主要是拖拽控件,代碼量很小,這篇文章主要介紹了基于Node-red的在線評語系統(tǒng)(可視化編程,公網(wǎng)訪問),需要的朋友可以參考下
    2022-01-01
  • node.js的Express服務器基本使用教程

    node.js的Express服務器基本使用教程

    express是一個開源的node.js項目框架,下面這篇文章主要給大家介紹了關于node.js的Express服務器基本使用的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • 理解Koa2中的async&await的用法

    理解Koa2中的async&await的用法

    這篇文章主要介紹了理解Koa2中的async&await的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 安裝Node.js并啟動本地服務的操作教程

    安裝Node.js并啟動本地服務的操作教程

    今天小編就為大家分享一篇安裝Node.js并啟動本地服務的操作教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Express進階之log4js實用入門指南

    Express進階之log4js實用入門指南

    本篇文章主要介紹了Express進階之log4js實用入門指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Node.js實現(xiàn)大文件斷點續(xù)傳示例詳解

    Node.js實現(xiàn)大文件斷點續(xù)傳示例詳解

    這篇文章主要為大家介紹了Node.js實現(xiàn)大文件斷點續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • node 使用 async 控制并發(fā)的方法

    node 使用 async 控制并發(fā)的方法

    這篇文章主要介紹了node 使用 async 控制并發(fā)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Nodejs進階:express+session實現(xiàn)簡易登錄身份認證

    Nodejs進階:express+session實現(xiàn)簡易登錄身份認證

    本篇文章主要介紹了Nodejs進階:express+session實現(xiàn)簡易身份認證示例,非常具有實用價值,需要的朋友可以參考下
    2017-04-04
  • node.js之基礎加密算法模塊crypto詳解

    node.js之基礎加密算法模塊crypto詳解

    這篇文章主要介紹了node.js之基礎加密算法模塊crypto詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • nodejs版本過高導致vue2版本的項目無法正常啟動的解決方案

    nodejs版本過高導致vue2版本的項目無法正常啟動的解決方案

    這篇文章主要給大家介紹了關于nodejs版本過高導致vue2版本的項目無法正常啟動的解決方案,本文小編給大家詳細介紹了如何解決這個問題,如有遇到同樣問題的朋友可以參考下
    2023-11-11

最新評論