Node.js 产生多个进程

Posted

技术标签:

【中文标题】Node.js 产生多个进程【英文标题】:Node.js spawns multiple processes 【发布时间】:2013-11-22 08:28:56 【问题描述】:

我对我的 node.js 应用程序有点困惑。据我所知,node.js 在单个进程中运行。但是,如果我通过调用 node app.js 启动我的应用程序并使用 htop 对其进行监视,我可以看到 4 个子进程正在运行,而我希望只有一个。

app.js

var express = require('express'),
    routes = require('./routes'),

    objects = require('./objects'),

    http = require('http'),
    path = require('path'),

    pinLayout = objects.pinlayout,

    // utils
    util = require('util'),
    wiringPi = require('wiring-pi'),
    winston = require('winston'),
    async = require('async');


// Logger - winston
var log = new(winston.Logger)(
    transports: [
        new(winston.transports.Console)(
            colorize: true,
            timestamp: true
        ),
        new(winston.transports.File)(
            filename: './log/app.log'
        )
    ]
);

// WiringPi
wiringPi.setup('gpio');

var app = express();

// all environments
app.set('port', process.env.PORT || 3001);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());

app.use(require('less-middleware')(
    src: __dirname + '/public',
    force: true,
    compress: true
));

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// 404 Page
app.use(function(req, res, next) 
    res.render('404.jade', 
        title: "404 - Page Not Found",
        showFullNav: false,
        status: 404,
        url: req.url
    );
);

// development only
if ('development' == app.get('env')) 
    app.use(express.errorHandler(
        dumpExceptions: true,
        showStack: true
    ));

【问题讨论】:

你能给我们看看代码吗?您使用哪些模块?我们需要更多信息。 您运行的应用程序本身是一个进程 - 但如果需要,您可以从该应用程序生成其他进程。保罗是对的 - 请分享更多细节 嘿,伙计们,我只是做了并删除了路由,除此之外我只声明了一些常量和函数,但在启动过程中,除了启动网络服务器并等待请求之外,实际上什么都没有发生。 【参考方案1】:

虽然您的代码在单个线程中运行,但 node.js (主要)使用线程池进行文件系统操作。这是必需的,因为 fs 没有异步 API。

例如当你调用file.readFile时,你会经过Read(),它会调用:

ASYNC_CALL(read, cb, fd, buf, len, pos);

read 是阻塞 unix read(2)。这将在一个线程中运行,直到完成。这些是您看到的线程。

【讨论】:

为了完成这个答案,这里有一个related answer,它显示了如何配置htop,以便不显示单个进程的不同线程。

以上是关于Node.js 产生多个进程的主要内容,如果未能解决你的问题,请参考以下文章

使用集群将 Socket.IO 扩展到多个 Node.js 进程时的一些问题

产生 ENOENT node.js 错误

管理 Node.js 进程从未如此优雅

如何让 Node.js 进程相互通信

使用 node.js 运行许多并行 http 请求

使用 --perf_basic_prof_only_functions 构建多个 node.js 进程的火焰图