【已解决】Nodejs中一个console.log不打印的问题

【已解决】Nodejs中一个console.log不打印的问题

初学node,请教个问题。 问题:console.log(‘start’); 这行为什么没有打印出来?。。。。。。eclipse的IDE没显示,命令行就显示了 源码如下:

var cluster = require(‘cluster’); var http = require(‘http’); var numCPUs = require(‘os’).cpus().length;

var rssWarn = (50 * 1024 * 1024),heapWarn = (50 * 1024 * 1024);

var workers = {};

if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { createWorker(); } setInterval(function(){ var time = new Date().getTime(); for (var pid in workers) { if (workers.hasOwnProperty(pid) && workers[pid].lastCb + 5000 < time) { console.log(‘Long running worker ’ + pid + ’ killed’); workers[pid].worker.kill(); delete workers[pid]; createWorker(); } } },1000); }else{ //服务器 http.Server(function(req,res){ if (Math.floor(Math.random() * 10) === 4) {//十分之一的概率 console.log(‘Stopped ’ + process.pid + ’ form ever finishinga’); console.log(‘start’);//我本地eclipseIDE估计环境问题,导致这行没打印出来。 while(true){continue;} console.log(‘end’); } res.writeHead(200); res.end('hello world form ’ + process.pid + ‘\n’); }).listen(8000); setInterval(function report(){ process.send({cmd:“reportMem”,memory:process.memoryUsage(),process: process.pid}); },1000); }

function createWorker(){ var worker = cluster.fork(); console.log('Created worker: ’ + worker.process.pid); workers[worker.process.pid] = {worker:worker,lastCb: new Date().getTime() - 1000}; worker.on(‘message’,function(m){ if (m.cmd === “reportMem”) { workers[m.process].lastCb = new Date().getTime(); if (m.memory.rss > rssWarn) { console.log(‘worker ’ + m.process + ’ using too much memory’); } } }); }


2 回复

【已解决】Node.js 中一个 console.log 不打印的问题

问题描述

在学习 Node.js 的过程中遇到一个问题:console.log('start'); 这一行代码没有打印输出。在 Eclipse IDE 中没有看到任何输出,但在命令行中能看到输出。

代码分析

首先来看一下你的代码:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

var rssWarn = (50 * 1024 * 1024), heapWarn = (50 * 1024 * 1024);

var workers = {};

if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        createWorker();
    }
    setInterval(function(){
        var time = new Date().getTime();
        for (var pid in workers) {
            if (workers.hasOwnProperty(pid) && workers[pid].lastCb + 5000 < time) {
                console.log('Long running worker ' + pid + ' killed');
                workers[pid].worker.kill();
                delete workers[pid];
                createWorker();
            }
        }
    }, 1000);
} else {
    // 服务器逻辑
    http.createServer(function(req, res) {
        if (Math.floor(Math.random() * 10) === 4) { // 十分之一的概率
            console.log('Stopped ' + process.pid + ' form ever finishinga');
            console.log('start'); // 这行代码没有打印出来
            while(true) { continue; }
            console.log('end');
        }
        res.writeHead(200);
        res.end('hello world from ' + process.pid + '\n');
    }).listen(8000);
    setInterval(function report() {
        process.send({ cmd: "reportMem", memory: process.memoryUsage(), process: process.pid });
    }, 1000);
}

function createWorker() {
    var worker = cluster.fork();
    console.log('Created worker: ' + worker.process.pid);
    workers[worker.process.pid] = { worker: worker, lastCb: new Date().getTime() - 1000 };
    worker.on('message', function(m) {
        if (m.cmd === "reportMem") {
            workers[m.process].lastCb = new Date().getTime();
            if (m.memory.rss > rssWarn) {
                console.log('worker ' + m.process + ' using too much memory');
            }
        }
    });
}

问题原因

console.log('start'); 没有打印的原因是代码中的 while(true) { continue; } 形成了一次死循环。这段代码会无限执行,导致后续的代码不会被执行,因此 console.log('end'); 也不会打印。

解决方案

移除或注释掉死循环部分,使代码能够正常执行:

if (Math.floor(Math.random() * 10) === 4) { // 十分之一的概率
    console.log('Stopped ' + process.pid + ' form ever finishinga');
    console.log('start');
    // 移除或注释掉以下死循环代码
    // while(true) { continue; }
    console.log('end');
}

总结

在 Node.js 中,死循环会导致程序无法继续执行后续代码,因此 console.log 等输出语句也会被阻塞。通过移除或注释掉死循环代码,可以确保 console.log 能够正常打印输出。


在你的代码中,console.log('start'); 不打印的原因是由于 while(true) { continue; } 这段代码导致了死循环。这段代码会一直运行,使得 console.log('start'); 之后的代码无法执行。

为了更好地理解,你可以修改代码以避免死循环,并且观察 console.log('start'); 是否会被打印。例如:

if (Math.floor(Math.random() * 10) === 4) {
    console.log('Stopped ' + process.pid + ' from ever finishing');
    console.log('start'); // 这行应该会打印
    // 移除或注释掉 while(true) { continue; }
    // 这里可以添加一些其他代码
    console.log('end'); // 这行应该也会打印
}

如果你确实需要进行长时间的处理,请考虑使用异步函数(如 setTimeoutsetImmediate)来避免阻塞主线程,从而确保 console.log 语句能够正常执行。

另外,如果你在 Eclipse IDE 中遇到问题,可能是 IDE 的输出窗口配置不正确。尝试在命令行中运行你的 Node.js 应用程序,以确认输出是否正确显示。

回到顶部