为什么将日期对象作为来自Worker线程的消息发送到字符串



我正在尝试通过多个CPU运行一些代码。每个CPU都有一些任务,然后他们将结果返回到将所有内容汇总在一起的主线程。

我不明白的是,每当我发送包含日期对象的消息时,该日期对象都会转换为字符串。必须在工人线程和主线程中分析这些约会似乎是荒谬的。我正在与很多日期合作,所以这会有巨大的表现。

我有什么能做的吗?我正在使用节点版本v10.13.0。

const cluster = require('cluster');
if (cluster.isMaster) {
  // init cluster
  require('os').cpus().forEach(() => {
    cluster.fork();
  });
  // add eventlisteners
  Object.values(cluster.workers).forEach(worker => {
    worker.on('message', message => {
      console.log(typeof message); // string
    });
  });
} else {
  process.send(new Date());
}

根据'message'事件的文档:

该消息通过序列化和解析。

Date对象的序列化是字符串:

// serialize and rebuilds an object: { test: "2019-03-05T16:20:17.863Z" }
JSON.parse(JSON.stringify({test: new Date()}));

所以,不,没有解决方法:每个过程(工人和主人)都有其自己的环境(即其自己的存储对象的空间),因此您无法在不同环境上共享参考文献。说明:

const input = {some: 'thing'};
const output = JSON.parse(JSON.stringify(input));
console.log('are input and output the same object?', input === output); // false

如果您担心这一点的性能,也许可以重新考虑您的体系结构,以便工人不需要在频道上发送那么多的日期。

作为旁注,您可以使用Date的内部时间戳而不是默认时间字符串来提高性能:

const t0 = new Date();
for (let i = 0; i < 1000000; i++) {
    const tmp = new Date();
    // this took ~6.9s on JSFiddle
    new Date(JSON.parse(JSON.stringify(tmp)));
    // this took ~2.8s on JSFiddle
    new Date(JSON.parse(JSON.stringify(+tmp)));
}
const t1 = new Date();
console.log('time spent', t1 - t0);

最新更新