UNPKG

@softvisio/core

Version:
60 lines (41 loc) 1.22 kB
import ThreadsPool from "#lib/threads/pool"; import Signal from "#lib/threads/signal"; import uuid from "#lib/uuid"; export default class ThreadsPoolQueue extends ThreadsPool { #queue = []; #results = {}; #signal = new Signal(); // public pushThread ( method, { highPriority, args } = {} ) { const id = uuid(); this.#queue.push( id ); this.runThread( method, { highPriority, args } ).then( res => { this.#results[ id ] = res; this.#ready(); } ); } async getResult () { // queue is empty if ( !this.#queue.length ) return; const res = this.#getResult(); if ( res ) return res; return this.#signal.wait(); } // private #ready () { if ( !this.#signal.waitingThreads ) return; const res = this.#getResult(); if ( !res ) return; this.#signal.broadcast( res ); this.#ready(); } #getResult () { const id = this.#queue[ 0 ]; if ( !id ) return; const res = this.#results[ id ]; if ( !res ) return; this.#queue.shift(); delete this.#results[ id ]; return res; } }