簡體   English   中英

Node.js Cluster + Express始終調用同一工作程序

[英]Node.js Cluster + Express always invoke the same worker

我正在嘗試使用群集模塊與Express同時處理多個http請求。

使用下面的代碼,我可以產生多個工作程序,並讓他們全部在同一端口上偵聽。 大的for循環可用來模擬Web服務器上的繁重負載。

我想看到的是,如果一個工作線程在第二個請求出現時正忙於處理一個http請求,則將調用另一個工作線程並處理該第二個請求。 相反,當我嘗試使用curl發出多個請求時,所有請求都由一個工作人員按順序處理; 即使已經分叉,也沒有其他工人被調用過。

可能是我使用Express的方式不正確嗎? 提前致謝!

var cluster = require('cluster');
if (cluster.isMaster) {
    var cpuCount = require('os').cpus().length;
    for (var i = 0; i < cpuCount; i += 1) {
        cluster.fork();
    }
}

else {
    var http = require('http'),
    app = require('express')();

    http.createServer(app).listen(31415, function () {
        console.log(process.pid + " listening on 31415");
    });

    app.get('/', function (req, res) {
        var t= 0;
        for(var i=0; i < 100000000; i++){
            t++;
        }
        res.send('done');
    });
}

嘗試不使用內置模塊?

master.js

var cp = require('child_process');
var net = require('net');
// create tcp server listen to a port
var tcp = net.createServer();
tcp.listen(8000, function(){
    // detect cpu number, and fork child process
    for (var i=0;i< require('os').cpus().length; i++) {
        var worker = cp.fork('child.js');
        worker.send(i, tcp._handle);
    }
    tcp.close();
});

child.js

var express = require('express');
var app = express();
process.on('message', function(id, handle){

    app.get('/',function(){
        console.log(process.pid+' is listening ...');
    });
    app.listen(handle, function(){
        console.log(process.pid + 'started');
    });
});

這適用於Express 3.x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM