molstar
Version:
A comprehensive macromolecular library.
124 lines (123 loc) • 5.11 kB
JavaScript
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.runChild = exports.runMaster = void 0;
var tslib_1 = require("tslib");
var path = tslib_1.__importStar(require("path"));
var cluster_1 = tslib_1.__importDefault(require("cluster"));
var now_1 = require("../../../mol-util/now");
var performance_monitor_1 = require("../../../mol-util/performance-monitor");
var preprocess_1 = require("./preprocess");
var property_provider_1 = require("../property-provider");
function runMaster(config, entries) {
var started = (0, now_1.now)();
var progress = 0;
var onMessage = function (msg) {
if (msg.type === 'tick') {
progress++;
var elapsed = (0, now_1.now)() - started;
console.log("[".concat(progress, "/").concat(entries.length, "] in ").concat(performance_monitor_1.PerformanceMonitor.format(elapsed), " (avg ").concat(performance_monitor_1.PerformanceMonitor.format(elapsed / progress), ")."));
}
else if (msg.type === 'error') {
console.error("".concat(msg.id, ": ").concat(msg.error));
}
};
if (entries.length === 1) {
runSingle(entries[0], config, onMessage);
}
else {
var parts = partitionArray(entries, config.numProcesses || 1);
for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
var _ = parts_1[_i];
var worker = cluster_1.default.fork();
worker.on('message', onMessage);
}
var i = 0;
for (var id in cluster_1.default.workers) {
cluster_1.default.workers[id].send({ entries: parts[i++], config: config });
}
}
}
exports.runMaster = runMaster;
function runChild() {
var _this = this;
process.on('message', function (_a) {
var entries = _a.entries, config = _a.config;
return tslib_1.__awaiter(_this, void 0, void 0, function () {
var props, _i, entries_1, entry, e_1;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
props = (0, property_provider_1.createModelPropertiesProvider)(config.customProperties);
_i = 0, entries_1 = entries;
_b.label = 1;
case 1:
if (!(_i < entries_1.length)) return [3 /*break*/, 7];
entry = entries_1[_i];
_b.label = 2;
case 2:
_b.trys.push([2, 4, , 5]);
return [4 /*yield*/, (0, preprocess_1.preprocessFile)(entry.source, props, entry.cif, entry.bcif)];
case 3:
_b.sent();
return [3 /*break*/, 5];
case 4:
e_1 = _b.sent();
process.send({ type: 'error', id: path.parse(entry.source).name, error: '' + e_1 });
return [3 /*break*/, 5];
case 5:
process.send({ type: 'tick' });
_b.label = 6;
case 6:
_i++;
return [3 /*break*/, 1];
case 7:
process.exit();
return [2 /*return*/];
}
});
});
});
}
exports.runChild = runChild;
function runSingle(entry, config, onMessage) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var props, e_2;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
props = (0, property_provider_1.createModelPropertiesProvider)(config.customProperties);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, (0, preprocess_1.preprocessFile)(entry.source, props, entry.cif, entry.bcif)];
case 2:
_a.sent();
return [3 /*break*/, 4];
case 3:
e_2 = _a.sent();
onMessage({ type: 'error', id: path.parse(entry.source).name, error: '' + e_2 });
return [3 /*break*/, 4];
case 4:
onMessage({ type: 'tick' });
return [2 /*return*/];
}
});
});
}
function partitionArray(xs, count) {
var ret = [];
var s = Math.ceil(xs.length / count);
for (var i = 0; i < xs.length; i += s) {
var bucket = [];
for (var j = i, _j = Math.min(xs.length, i + s); j < _j; j++) {
bucket.push(xs[j]);
}
ret.push(bucket);
}
return ret;
}
;