Javascript ES6和ES2016在cluster.on上使用babel时的不同行为
我试图使用集群来利用拥有多核CPU的好处。代码为:Javascript ES6和ES2016在cluster.on上使用babel时的不同行为,javascript,ecmascript-6,ecmascript-2016,Javascript,Ecmascript 6,Ecmascript 2016,我试图使用集群来利用拥有多核CPU的好处。代码为: var cluster = require('cluster'); if (cluster.isMaster) { for(var i = 0; i < 2; ++i) { cluster.fork(); } cluster.on('exit', function (worker) { console.log('Worker ' + worker.process.pid + ' e
var cluster = require('cluster');
if (cluster.isMaster) {
for(var i = 0; i < 2; ++i) {
cluster.fork();
}
cluster.on('exit', function (worker) {
console.log('Worker ' + worker.process.pid + ' exitted.');
});
} else {
console.log('Worker ' + cluster.worker.process.pid);
process.exit(0);
}
但是,当我尝试与babel一起使用import
时,我遇到了以下问题:
import * as cluster from 'cluster'
if (cluster.isMaster) {
for(let i = 0; i < 2; ++i) {
cluster.fork();
}
cluster.on('exit', (worker) => console.log('Worker ' + worker.process.pid + ' exitted.'));
} else {
console.log('Worker ' + cluster.worker.process.pid);
process.exit(0);
}
知道发生了什么吗?好的,我找到了原因,参考: 重点是将
import*作为集群从'cluster'
更改为import cluster from'cluster'
使用“集群”中的import*作为集群
,所有可导出的内容都将导出到名为cluster
的对象中,该对象具有以下结构:
{ domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker:
{ [Function: Worker]
super_:
{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: 10,
init: [Function],
listenerCount: [Function] } },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function],
default:
EventEmitter {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker: { [Function: Worker] super_: [Object] },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function] } }
另一方面,当从“集群”导入集群时,集群
对象是默认的导出:
EventEmitter {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker:
{ [Function: Worker]
super_:
{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: 10,
init: [Function],
listenerCount: [Function] } },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function] }
将您的代码保存在test.js中,然后查看神奇的表单“我”一个接一个地导入,通过对集群中需要的内容进行解构,它成功了:
import { fork, on, isMaster } from 'cluster';
然后
虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
{ domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker:
{ [Function: Worker]
super_:
{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: 10,
init: [Function],
listenerCount: [Function] } },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function],
default:
EventEmitter {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker: { [Function: Worker] super_: [Object] },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function] } }
EventEmitter {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
Worker:
{ [Function: Worker]
super_:
{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: 10,
init: [Function],
listenerCount: [Function] } },
isWorker: false,
isMaster: true,
workers: {},
settings: {},
schedulingPolicy: 2,
SCHED_NONE: 1,
SCHED_RR: 2,
setupMaster: [Function],
fork: [Function],
disconnect: [Function] }
require('babel-core/register')({
presets: ['node6']
});
const app = require('./test.js');
app();
import { fork, on, isMaster } from 'cluster';
if (isMaster) {
console.log(`Forking ${numWorkers} workers`);
const workers = [...Array(numWorkers)].map(_ => fork());
on('online', worker => console.log(`Worker ${worker.process.pid} is online`));
}