UNPKG

flexbiz-server

Version:

Flexible Server

5 lines (4 loc) 1.51 kB
const worker_threads=require("worker_threads"),{AsyncResource}=require("async_hooks"); module.exports=class{constructor($opts$$){$opts$$=$opts$$||{};this._workers=new Set;this._queue=[];this._max=$opts$$.max||1;this._maxWaiting=$opts$$.maxWaiting||Infinity}get size(){return this._workers.size}acquire($filename$$,$opts$$,$cb$$){function $done$$(){Logger.info("delete worker...",$filename$$);$self$$._workers.delete($worker$$);$worker$$.removeListener("error",$done$$);$worker$$.removeListener("exit",$done$$);const $resource$$=$self$$._queue.shift();$resource$$&&$resource$$.addToPool()} if(typeof $opts$$==="function")return this.acquire($filename$$,void 0,$opts$$);if(this._workers.size===this._max)this._queue.length===this._maxWaiting?process.nextTick($cb$$.bind(null,Error("Pool queue is full"))):this._queue.push(new QueuedWorkerThread(this,$filename$$,$opts$$,$cb$$));else{var $self$$=this,$worker$$=new worker_threads.Worker($filename$$,$opts$$);$worker$$.once("error",$done$$);$worker$$.once("exit",$done$$);this._workers.add($worker$$);process.nextTick($cb$$.bind(null,null,$worker$$))}}destroy(){for(let $worker$$ of this._workers)$worker$$.terminate()}}; class QueuedWorkerThread extends AsyncResource{constructor($pool$$,$filename$$,$opts$$,$cb$$){super("worker-threads-pool:enqueue");this.pool=$pool$$;this.filename=$filename$$;this.opts=$opts$$;this.cb=$cb$$}addToPool(){this.pool.acquire(this.filename,this.opts,($err$$,$worker$$)=>{this.runInAsyncScope(this.cb,null,$err$$,$worker$$)})}};