为什么从工作线程发送日期对象作为消息将其转换为字符串?
Why does sending a Date Object as a message from a worker thread convert it to a string?
我正在尝试 运行 一些代码跨多个 CPU。每个 cpu 都被分配了一些任务,然后他们 return 将结果发送给主线程,主线程将所有内容聚合在一起。
我不明白的是,每当我发送包含日期对象的消息时,该日期对象都会转换为字符串。在工作线程和主线程中都必须将这些解析为日期似乎很荒谬。我正在处理很多日期,因此这会对性能产生巨大影响。
有什么办法可以解决这个问题吗?我正在使用节点版本 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'
事件的documentation:
The message goes through serialization and parsing.
一个Date
对象的序列化是一个字符串:
// serialize and rebuilds an object: { test: "2019-03-05T16:20:17.863Z" }
JSON.parse(JSON.stringify({test: new Date()}));
所以,不,没有解决方法:每个进程(worker 和 master 都一样)都有自己的环境(即它自己的 space 来存储对象),所以你不能在不同的环境之间共享引用。举例说明:
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);
我正在尝试 运行 一些代码跨多个 CPU。每个 cpu 都被分配了一些任务,然后他们 return 将结果发送给主线程,主线程将所有内容聚合在一起。
我不明白的是,每当我发送包含日期对象的消息时,该日期对象都会转换为字符串。在工作线程和主线程中都必须将这些解析为日期似乎很荒谬。我正在处理很多日期,因此这会对性能产生巨大影响。
有什么办法可以解决这个问题吗?我正在使用节点版本 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'
事件的documentation:
The message goes through serialization and parsing.
一个Date
对象的序列化是一个字符串:
// serialize and rebuilds an object: { test: "2019-03-05T16:20:17.863Z" }
JSON.parse(JSON.stringify({test: new Date()}));
所以,不,没有解决方法:每个进程(worker 和 master 都一样)都有自己的环境(即它自己的 space 来存储对象),所以你不能在不同的环境之间共享引用。举例说明:
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);