【问题标题】:How to modify global variable from worker thread in nodejs如何从nodejs中的工作线程修改全局变量
【发布时间】:2021-03-19 23:56:18
【问题描述】:

最近遇到worker thread是nodejs中实现的一个新特性,但是好像没有办法从worker thread访问和修改它,你知道有什么办法吗?

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

global.myvar = "initial variable"


if (isMainThread) {
  const worker = new Worker(__filename);
// Receive messages from the worker thread
  worker.once('message', (message) => {
    console.log(message + ' received from the worker thread!');
  });
// Send a ping message to the spawned worker thread 
  worker.postMessage("");

  setTimeout(function() {
    console.log("final variable : " + global.myvar);
  }, 2000);

} else {
  // When a ping message received, send a pong message back.
  console.log("inside worker thread");
  parentPort.on('message', (message) => {
        global.myvar = "worker variable"
  });
}

在这段代码中,我希望最终的变量是值"worker variable",但它显示"initial variable",请问我该如何解决这个问题?

【问题讨论】:

  • 出于好奇,您打算使用工作线程做什么。因为如果您不了解它们的工作原理,那么您很有可能甚至不需要它们。例如,我在 SO 上看到一些用户使用工作线程进行异步操作,这完全是对 Node.js 领域的资源浪费。
  • @Keith 我正在从 websocket 获取实时股票和加密货币价格数据并执行一些 CPU 密集型计算,在我之前的方式中,如果我直接在 websocket 监听函数上执行计算,它将只是减慢后续 websocket 价格馈送的接收和处理时间。您对此有更好的解决方案吗?
  • 是的,昂贵的计算是 webworkers 的理想选择,记住不要把 websocket 放在外面,只是计算。就像@TJ 指出的那样,您缺少的一点是您需要您的网络工作者将消息发送回主线程,在主线程上使用promcess.on('message'),..
  • 非常感谢您的评论,我想知道是否会出现websocket数据进入非常频繁,导致我的CPU无法处理或接收延迟消息的情况?因为要访问数据并实时执行:)
  • 如果您从 websocket 获得的数据只会被工作人员使用,那么它们可能是一个好处。不是因为处理 websocket 数据包的延迟,而是必须将其转发给工作人员。

标签: javascript node.js variables scope


【解决方案1】:

工作线程和主线程在完全独立的 JavaScript 环境中运行。他们每个人都有自己的一组全局变量,等等。

worker 不能直接修改父变量的内容。它需要通过消息向父级发送更新,父级将通过更新全局变量来处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多