nodejs多线程的价值
正常实现
const express = require('express')
console.log('Spawn http server')
const app = express()
function fibonacci(n) {
if (n < 0) throw new Error('输入的数字不能小于0');
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
app.get('/hello', (req, res) => {
res.json({ msg: 'hello world' })
})
app.get('/compute', (req, res) => {
console.time('compute')
const msg = fibonacci(30)
console.timeEnd('compute')
res.json({ msg: msg })
})
app.listen(3000)
多线程实现
const express = require('express')
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads')
if (isMainThread) {
console.log('Spawn http server')
const app = express()
app.get('/hello', (req, res) => {
res.json({ msg: 'hello world' })
})
app.get('/compute', (req, res) => {
console.time('compute')
const num = req.query.num;
const woker = new Worker(__filename, { workerData: null })
woker.postMessage({ num })
woker.on('message', (msg) => {
console.log(msg)
console.timeEnd('compute')
res.json({ msg: msg })
})
})
app.listen(3000)
} else {
function fibonacci(n) {
if (n < 0) throw new Error('输入的数字不能小于0');
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
parentPort.on('message', (msg) => {
parentPort.postMessage({ result: fibonacci(msg.num) })
})
}
多线程作用
多线程可以在主线程之外同步进行工作 所以子线程是在主线程之外可以同时计算,不会阻塞主线程的响应
问题: 因为斐波那契数列计算很耗时,不管是主线程还是子线程都很久,想要响应结果只能等待,还是阻塞了。 如何对多线程的代码进行优化使其不阻塞。
所以就看不到多线程的价值所在
3 回复
你这个例子完全体现不出多线程的意义。 多线程解决的是并行事物, 比如说,我要求 四个斐波那契数列[40, 41, 42, 43] 的结果 。 这时候就可以开四个线程,每个线程做自己的运算,然后用promise.all 等待所有的线程都响应的时候,把结果一并抛出。 这就节约了大量的时间。 demo:https://github.com/ounana/nicest/blob/master/src/test/thread/fibonacci.ts
因为你开了多线程 也只用到一个cpu了吧
@ounana 谢谢,说的很有道理