国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:59:29
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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

這里了解一下包括 fork 在內的幾個進程創建方法:

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

Node 進程間通信

父進程

復制代碼 代碼如下:

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

子進程

復制代碼 代碼如下:

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

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

send 方法的原型為:

復制代碼 代碼如下:

send(message, [sendHandle])

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

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

現在看一個例子:

父進程

復制代碼 代碼如下:

// parent.js
var fork = require('child_process').fork;
 
var n = fork('./child.js');
 
var server = require('net').createServer();
server.listen(7000, function() {
    // 發送 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

主站蜘蛛池模板: 抚顺市| 睢宁县| 腾冲县| 泰兴市| 高台县| 绥棱县| 乳山市| 疏附县| 西宁市| 宜宾市| 广安市| 兴隆县| 洪雅县| 克山县| 岐山县| 镇赉县| 太康县| 紫云| 北辰区| 德兴市| 赤水市| 读书| 云和县| 千阳县| 静乐县| 濮阳县| 乐都县| 九龙城区| 金寨县| 新田县| 仁寿县| 都江堰市| 五指山市| 武功县| 彭山县| 泗阳县| 韶关市| 安宁市| 买车| 阳东县| 洛南县|