mirror of https://gitee.com/antv-l7/antv-l7
94 lines
3.0 KiB
JavaScript
94 lines
3.0 KiB
JavaScript
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", {
|
|||
|
value: true
|
|||
|
});
|
|||
|
exports["default"] = void 0;
|
|||
|
|
|||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|||
|
|
|||
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|||
|
|
|||
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|||
|
|
|||
|
var WorkerPool =
|
|||
|
/*#__PURE__*/
|
|||
|
function () {
|
|||
|
function WorkerPool(workerCount) {
|
|||
|
_classCallCheck(this, WorkerPool);
|
|||
|
|
|||
|
this.workerCount = workerCount || Math.max(Math.floor(window.navigator.hardwareConcurrency / 2), 1);
|
|||
|
this.workers = []; // worker线程池
|
|||
|
|
|||
|
this.workerQueue = []; // 任务队列
|
|||
|
|
|||
|
this._initWorker(); // 初始化线程池
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
_createClass(WorkerPool, [{
|
|||
|
key: "_initWorker",
|
|||
|
value: function _initWorker() {
|
|||
|
while (this.workers.length < this.workerCount) {
|
|||
|
this.workers.push(new Worker());
|
|||
|
}
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "runTask",
|
|||
|
value: function runTask(payload) {
|
|||
|
var _this = this;
|
|||
|
|
|||
|
return new Promise(function (resolve, reject) {
|
|||
|
if (_this.workers.length > 0) {
|
|||
|
var worker = _this.workers.shift(); // 从线程池取出一个worker
|
|||
|
|
|||
|
|
|||
|
worker.postMessage(payload); // 向线程发送数据
|
|||
|
|
|||
|
var workerCallback = function workerCallback(e) {
|
|||
|
resolve(e.data); // 成功则返回数据
|
|||
|
// 移除事件监听
|
|||
|
|
|||
|
worker.removeEventListener('message', workerCallback); // 重新放回线程池
|
|||
|
|
|||
|
_this.workers.push(worker); // 如果任务队列的数据还有则从任务队列继续取数据执行任务
|
|||
|
|
|||
|
|
|||
|
if (_this.workerQueue.length > 0) {
|
|||
|
var queueData = _this.workerQueue.shift();
|
|||
|
|
|||
|
_this.runTask(queueData.payload).then(function (data) {
|
|||
|
queueData.resolve(data);
|
|||
|
});
|
|||
|
}
|
|||
|
}; // 监听worker事件
|
|||
|
|
|||
|
|
|||
|
worker.addEventListener('message', workerCallback);
|
|||
|
worker.addEventListener('error', function (e) {
|
|||
|
reject('filename:' + e.filename + '\nmessage:' + e.message + '\nlineno:' + e.lineno);
|
|||
|
});
|
|||
|
} else {
|
|||
|
// 如果线程池都被占用,则将数据丢入任务队列,并保存对应的resolve和reject
|
|||
|
_this.workerQueue.push({
|
|||
|
payload: payload,
|
|||
|
resolve: resolve,
|
|||
|
reject: reject
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "release",
|
|||
|
value: function release() {
|
|||
|
this.workers.forEach(function (worker) {
|
|||
|
worker.terminate();
|
|||
|
});
|
|||
|
}
|
|||
|
}]);
|
|||
|
|
|||
|
return WorkerPool;
|
|||
|
}();
|
|||
|
|
|||
|
var _default = WorkerPool;
|
|||
|
exports["default"] = _default;
|