UNPKG

molstar

Version:

A comprehensive macromolecular library.

119 lines (118 loc) 4.7 kB
/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ import { __awaiter, __generator } from "tslib"; import * as path from 'path'; import cluster from 'cluster'; import { now } from '../../../mol-util/now'; import { PerformanceMonitor } from '../../../mol-util/performance-monitor'; import { preprocessFile } from './preprocess'; import { createModelPropertiesProvider } from '../property-provider'; export function runMaster(config, entries) { var started = now(); var progress = 0; var onMessage = function (msg) { if (msg.type === 'tick') { progress++; var elapsed = now() - started; console.log("[".concat(progress, "/").concat(entries.length, "] in ").concat(PerformanceMonitor.format(elapsed), " (avg ").concat(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.fork(); worker.on('message', onMessage); } var i = 0; for (var id in cluster.workers) { cluster.workers[id].send({ entries: parts[i++], config: config }); } } } export function runChild() { var _this = this; process.on('message', function (_a) { var entries = _a.entries, config = _a.config; return __awaiter(_this, void 0, void 0, function () { var props, _i, entries_1, entry, e_1; return __generator(this, function (_b) { switch (_b.label) { case 0: props = 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*/, 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*/]; } }); }); }); } function runSingle(entry, config, onMessage) { return __awaiter(this, void 0, void 0, function () { var props, e_2; return __generator(this, function (_a) { switch (_a.label) { case 0: props = createModelPropertiesProvider(config.customProperties); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, 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; }