【译】Node.js工作线程介绍

栏目: Node.js · 发布时间: 6年前

内容简介:几天前,Node.js的10.5.0版本已经发布,其中包含的主要功能之一是增加了对(和实验)线程支持。有意思的是,作为一门不已线程为荣并拥有非常棒的异步I/O的语言。那么为什么我们还需要在Node中的线程呢?最简单的回答是:为了解决在处理繁重的CPU密集型计算时,表现更为出色。因为Node.js在AI,机器学习,数据科学等领域表现并不是很强大。有很多正在进行努力解决这个问题,但我们还没有部署例如微服务时一样高性能的。

几天前,Node.js的10.5.0版本已经发布,其中包含的主要功能之一是增加了对(和实验)线程支持。

有意思的是,作为一门不已线程为荣并拥有非常棒的异步I/O的语言。那么为什么我们还需要在Node中的线程呢?

最简单的回答是:为了解决在处理繁重的CPU密集型计算时,表现更为出色。因为Node.js在AI,机器学习,数据科学等领域表现并不是很强大。有很多正在进行努力解决这个问题,但我们还没有部署例如微服务时一样高性能的。

这里,我根据官方文档,写了一个简单的案例,希望对你开始学习线程会有一点帮助。

如何使用线程模块?

首先,我们需要引入 worker_threads 模块。

注意,只有在启动脚本中使用 --experimental-worker 才有用。否则模块是无法被找到的。

注意区分 worker 和线程,整个文档将介绍如何引用:工作线程或简单的 worker

如果你过去使用过多处理,你会发现这种方法有很多相似之处,但如果你没有,请不要担心,我会尽可能多地解释。

你能用它做什么?

工作线程就像我之前提到的那样,用于处理CPU密集型任务,不适用于I/O密集型任务。因为根据官方文档,Node提供的处理异步I/O的内部机制比使用工作线程更有效。所以…不要同时使用。

让我们从一个简单的例子开始,学习如何创建一个工作线程并使用它。

案例1

const { Worker, isMainThread,  workerData } = require('worker_threads');

let currentVal = 0;
let intervals = [100,1000, 500]

function counter(id, i){
  console.log("[", id, "]", i)
  return i;
}

if(isMainThread) {
  console.log("this is the main thread")
  for(let i = 0; i < 2; i++) {
    let w = new Worker(__filename, {workerData: i});
  }

  setInterval((a) => currentVal = counter(a,currentVal + 1), intervals[2], "MainThread");
} else {

  console.log("this isn't")

  setInterval((a) => currentVal = counter(a,currentVal + 1), intervals[workerData], workerData);

}

上面的例子将简单地输出一组显示增量计数器的行,这将使用不同的速度增加它们的值。

【译】Node.js工作线程介绍

让我们分解一下:

  • if 语句中的代码创建了2个工作线程,由于传递了 __filename 参数,因此它们的代码取自同一个文件。 工作线程现在需要文件的完整路径,他们无法处理相对路径,因此这就是使用此值的原因。
  • 将2个 worker 作为全局参数发送,其形式为您在第二个参数中看到的 workerData 属性。 然后可以通过具有相同名称的常量访问该值(请参阅如何在文件的第一行中创建常量,并在稍后的最后一行中使用该常量)。

这个例子是你可以用这个模块做的最基本的事情之一,但它不是那么有趣,是吗? 让我们看另一个例子。

案例2

作为最后一个例子,我将坚持使用相同的功能,但向您展示如何清理它并具有更易维护的版本。

const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const request = require("request");

function startWorker(path, cb) {
  let w = new Worker(path, {workerData: null});
  w.on('message', (msg) => {
    cb(null, msg)
  })
  w.on('error', cb);
  w.on('exit', (code) => {
    if(code != 0)
          console.error(new Error(`Worker stopped with exit code ${code}`))
   });
  return w;
}

console.log("this is the main thread")

let myWorker = startWorker(__dirname + '/workerCode.js', (err, result) => {
  if(err) return console.error(err);
  console.log("[[Heavy computation function finished]]")
  console.log("First value is: ", result.val);
  console.log("Took: ", (result.timeDiff / 1000), " seconds");
})

const start = Date.now();
request.get('http://www.google.com', (err, resp) => {
  if(err) {
    return console.error(err);
  }
  console.log("Total bytes received: ", resp.body.length);
  //myWorker.postMessage({finished: true, timeDiff: Date.now() - start}) //you could send messages to your workers like this
})

并且您的线程代码可以在另一个文件中,例如:

const {  parentPort } = require('worker_threads');

function random(min, max) {
  return Math.random() * (max - min) + min
}

const sorter = require("./test2-worker");

const start = Date.now()
let bigList = Array(1000000).fill().map( (_) => random(1,10000))

/**
//you can receive messages from the main thread this way:
parentPort.on('message', (msg) => {
  console.log("Main thread finished on: ", (msg.timeDiff / 1000), " seconds...");
})
*/

sorter.sort(bigList);
parentPort.postMessage({ val: sorter.firstValue, timeDiff: Date.now() - start});

分解一下,我们看到:

startWorkerfunction
worker

通过这篇文章,我希望你能够理解如何开始使用这个新模块。 请记住:

  1. 这仍然是高度实验性的,这里解释的内容可能会在未来的版本中发生。
  2. 去阅读PR评论和文档,有关于此的更多信息,我只关注它的基本步骤。
  3. 玩的开心! 四处游玩,报告错误并提出改进建议,这刚刚开始!

原文: https://medium.com/dailyjs/threads-in-node-10-5-0-a-practical-intro-3b85a0a3c953


以上所述就是小编给大家介绍的《【译】Node.js工作线程介绍》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器