nodejs多线程的价值
发布于 5 年前 作者 heshuai326 6065 次浏览 来自 问答

正常实现

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 谢谢,说的很有道理

回到顶部