国产探花免费观看_亚洲丰满少妇自慰呻吟_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

主站蜘蛛池模板: 铜川市| 安庆市| 香格里拉县| 石家庄市| 威信县| 昭觉县| 策勒县| 中方县| 屯留县| 海丰县| 花莲县| 红桥区| 改则县| 灵武市| 宣武区| 邵阳县| 临清市| 长岭县| 中超| 井冈山市| 微博| 牡丹江市| 鹰潭市| 墨竹工卡县| 胶州市| 云浮市| 南溪县| 分宜县| 遂溪县| 乌鲁木齐县| 英吉沙县| 绥棱县| 分宜县| 昔阳县| 巴青县| 砀山县| 潼关县| 乡宁县| 花莲市| 延边| 师宗县|