@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
68 lines • 2.25 kB
JavaScript
import { asyncScheduler } from "rxjs";
export class RcsbFvAlignmentCollectorQueue {
constructor(nWorkers) {
this.workerList = new Array();
this.taskQueue = new Array();
this.isQueueActive = false;
if (nWorkers != null)
this.nWorkers = nWorkers;
else
this.nWorkers = self.navigator.hardwareConcurrency;
for (let i = 0; i < this.nWorkers; i++) {
this.workerList.push({
available: true,
worker: new Worker("/saguaro/worker.js")
});
}
}
sendTask(request, callback) {
const available = this.workerList.filter(d => d.available);
if (available.length > 0) {
available[0].available = false;
available[0].worker.postMessage(request);
available[0].worker.onmessage = (e) => {
callback(e.data);
available[0].available = true;
};
}
else {
this.taskQueue.push({ request: request, callback: callback });
if (!this.isQueueActive)
this.activateQueue();
}
}
activateQueue() {
this.isQueueActive = true;
this.recursiveExec();
}
recursiveExec() {
if (this.taskQueue.length == 0) {
this.isQueueActive = false;
}
else {
this.isQueueActive = true;
this.workerList.filter(d => d.available).forEach(aW => {
if (this.taskQueue.length > 0) {
aW.available = false;
const task = this.taskQueue.shift();
if (!task)
return;
aW.worker.postMessage(task.request);
aW.worker.onmessage = (e) => {
task.callback(e.data);
aW.available = true;
};
}
});
asyncScheduler.schedule(() => {
this.recursiveExec();
}, 1000);
}
}
terminateWorkers() {
this.workerList.forEach(w => {
w.worker.terminate();
});
}
}
//# sourceMappingURL=RcsbFvAlignmentCollectorQueue.js.map