Resolve #3132
This commit is contained in:
parent
6c5a78aeb2
commit
e9a3495225
24
src/index.ts
24
src/index.ts
|
@ -17,7 +17,6 @@ import * as program from 'commander';
|
||||||
import mongo from './db/mongodb';
|
import mongo from './db/mongodb';
|
||||||
|
|
||||||
import Logger from './misc/logger';
|
import Logger from './misc/logger';
|
||||||
import ProgressBar from './misc/cli/progressbar';
|
|
||||||
import EnvironmentInfo from './misc/environmentInfo';
|
import EnvironmentInfo from './misc/environmentInfo';
|
||||||
import MachineInfo from './misc/machineInfo';
|
import MachineInfo from './misc/machineInfo';
|
||||||
import serverStats from './daemons/server-stats';
|
import serverStats from './daemons/server-stats';
|
||||||
|
@ -87,10 +86,9 @@ async function masterMain() {
|
||||||
|
|
||||||
if (!program.disableClustering) {
|
if (!program.disableClustering) {
|
||||||
await spawnWorkers(config.clusterLimit);
|
await spawnWorkers(config.clusterLimit);
|
||||||
Logger.succ('All workers started');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.info(`Now listening on port ${config.port} on ${config.url}`);
|
Logger.succ(`Now listening on port ${config.port} on ${config.url}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -168,28 +166,30 @@ function checkMongoDb(config: Config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function spawnWorkers(limit: number) {
|
function spawnWorkers(limit: number) {
|
||||||
|
Logger.info('Starting workers...');
|
||||||
|
|
||||||
return new Promise(res => {
|
return new Promise(res => {
|
||||||
// Count the machine's CPUs
|
// Count the machine's CPUs
|
||||||
const cpuCount = os.cpus().length;
|
const cpuCount = os.cpus().length;
|
||||||
|
|
||||||
const count = limit || cpuCount;
|
const count = limit || cpuCount;
|
||||||
|
let started = 0;
|
||||||
const progress = new ProgressBar(count, 'Starting workers');
|
|
||||||
|
|
||||||
// Create a worker for each CPU
|
// Create a worker for each CPU
|
||||||
for (let i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
const worker = cluster.fork();
|
const worker = cluster.fork();
|
||||||
|
|
||||||
worker.on('message', message => {
|
worker.on('message', message => {
|
||||||
if (message === 'ready') {
|
if (message !== 'ready') return;
|
||||||
progress.increment();
|
started++;
|
||||||
|
|
||||||
|
// When all workers started
|
||||||
|
if (started == count) {
|
||||||
|
Logger.succ('All workers started');
|
||||||
|
res();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// On all workers started
|
|
||||||
progress.on('complete', () => {
|
|
||||||
res();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
import { EventEmitter } from 'events';
|
|
||||||
import * as readline from 'readline';
|
|
||||||
import chalk from 'chalk';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Progress bar
|
|
||||||
*/
|
|
||||||
export default class extends EventEmitter {
|
|
||||||
public max: number;
|
|
||||||
public value: number;
|
|
||||||
public text: string;
|
|
||||||
private indicator: number;
|
|
||||||
|
|
||||||
constructor(max: number, text: string = null) {
|
|
||||||
super();
|
|
||||||
this.max = max;
|
|
||||||
this.value = 0;
|
|
||||||
this.text = text;
|
|
||||||
this.indicator = 0;
|
|
||||||
this.draw();
|
|
||||||
|
|
||||||
const iclock = setInterval(() => {
|
|
||||||
this.indicator = (this.indicator + 1) % 4;
|
|
||||||
this.draw();
|
|
||||||
}, 200);
|
|
||||||
|
|
||||||
this.on('complete', () => {
|
|
||||||
clearInterval(iclock);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public increment(): void {
|
|
||||||
this.value++;
|
|
||||||
this.draw();
|
|
||||||
|
|
||||||
// Check if it is fulfilled
|
|
||||||
if (this.value === this.max) {
|
|
||||||
this.indicator = null;
|
|
||||||
|
|
||||||
cll();
|
|
||||||
process.stdout.write(`${this.render()} -> ${chalk.bold('Complete')}\n`);
|
|
||||||
|
|
||||||
this.emit('complete');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public draw(): void {
|
|
||||||
const str = this.render();
|
|
||||||
cll();
|
|
||||||
process.stdout.write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
private render(): string {
|
|
||||||
const width = 30;
|
|
||||||
const t = this.text ? `${this.text} ` : '';
|
|
||||||
|
|
||||||
const v = Math.floor((this.value / this.max) * width);
|
|
||||||
const vs = new Array(v + 1).join('*');
|
|
||||||
|
|
||||||
const p = width - v;
|
|
||||||
const ps = new Array(p + 1).join(' ');
|
|
||||||
|
|
||||||
const percentage = Math.floor((this.value / this.max) * 100);
|
|
||||||
const percentages = chalk.gray(`(${percentage} %)`);
|
|
||||||
|
|
||||||
let i: string;
|
|
||||||
switch (this.indicator) {
|
|
||||||
case 0: i = '-'; break;
|
|
||||||
case 1: i = '\\'; break;
|
|
||||||
case 2: i = '|'; break;
|
|
||||||
case 3: i = '/'; break;
|
|
||||||
case null: i = '+'; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${i} ${t}[${vs}${ps}] ${this.value} / ${this.max} ${percentages}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear current line
|
|
||||||
*/
|
|
||||||
function cll(): void {
|
|
||||||
readline.clearLine(process.stdout, 0); // Clear current text
|
|
||||||
readline.cursorTo(process.stdout, 0, null); // Move cursor to the head of line
|
|
||||||
}
|
|
Loading…
Reference in a new issue