Nodejs学习准备中,最担心多线程和回调地狱

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs学习准备中,最担心多线程和回调地狱

你们是用哪些第三方库来处理这 2 个问题的 ?

18 回复

nodejs 是没有多线程问题的吧。


nodejs 没有多线程。还有你都没学 nodejs 为什么就开始考虑回调地狱了?

Node.js 没有多线程

担心回调地狱,可以用 Generator 函数啊

如果是做 web 后端,推荐 Koa 框架

那应该怎么充分的利用多核?

充分利用多核是解释器那部分的事情吧

Cluster: https://nodejs.org/api/cluster.html
至于回调地狱,完全可以直接上手 Generator 或者 Promise 。

async/await 大法好, 而且你可以用, https://github.com/Microsoft/ChakraCore 引擎级别支持.

pm2 start app -i max 按照 CPU 线程开启多个 node 实例

第一个问题没有
第二个问题有伪解决方案,还是要等 async/await 标准化才能最终解决

上 Promise 吧,感觉是目前避免回调地狱的最简单的方式了,很多第三方库也已经原生支持 then 方法

  1. 以前是 pm2 来弥补了不足,后来官方自己推荐用 [Cluster]( https://nodejs.org/api/cluster.html)
    2. 以前用 async 包(es5),以及 bluebird (Promise 第三方实现 es6 的标准)。还有大家说的 async/await 那个是 es7 的东西

使用 ES7 async/await 的思想,使用 ES6 generator 来写代码。
类似
python3.4 的 asyncio + yield
python3.5 的 async + await

去看 co.wrap & bluebird.coroutine 即可,一样的东西。

我浅尝辄止地学了一段时间后,还是觉得转投 Python 阵营比较适合我

推荐使用 ThinkJS ,完全没有回调地狱的问题

ChakraCore 是不是也可以做桌面应用,如果 ms 可以提供一些系统级接口就好了

关于回调,还是建议用 Promise 吧,已经是 ES6 标准了, NodeJS 也已经原生支持了

在Node.js学习过程中,多线程和回调地狱确实是两大难点,但都有相应的解决方案。

关于多线程,Node.js本身使用单线程模型,但可以通过子进程和集群模块来处理多线程需求。例如,使用子进程模块执行系统命令:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
});

对于集群模块,可以在多个进程中运行Node.js应用,实现负载均衡和高可用性:

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

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello World\n');
    }).listen(8000);
}

关于回调地狱,可以通过Promise对象和async/await语法来解决。例如,使用Promise改写回调:

function asyncOperation1() {
    return new Promise((resolve) => {
        setTimeout(() => resolve('result1'), 1000);
    });
}

asyncOperation1().then((result1) => {
    console.log(result1);
    // 进一步的异步操作
});

或者使用async/await:

async function main() {
    const result1 = await asyncOperation1();
    console.log(result1);
    // 进一步的异步操作
}

main();

通过以上方法,你可以更好地掌握Node.js的多线程处理和异步编程技巧。

回到顶部