Add Web Worker

This commit is contained in:
MengYX 2020-02-05 00:30:44 +08:00
parent 92bd0f6be3
commit 402fb184f7
No known key found for this signature in database
GPG Key ID: E63F9C7303E8F604
4 changed files with 50 additions and 36 deletions

9
package-lock.json generated
View File

@ -11215,6 +11215,15 @@
"errno": "~0.1.7" "errno": "~0.1.7"
} }
}, },
"workerize-loader": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/workerize-loader/download/workerize-loader-1.1.0.tgz",
"integrity": "sha1-06Y0OQ3LaFzB7iks0f/+7wpkYEQ=",
"dev": true,
"requires": {
"loader-utils": "^1.2.3"
}
},
"wrap-ansi": { "wrap-ansi": {
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz",

View File

@ -21,6 +21,7 @@
"@vue/cli-service": "^4.1.2", "@vue/cli-service": "^4.1.2",
"babel-plugin-component": "^1.1.1", "babel-plugin-component": "^1.1.1",
"vue-cli-plugin-element": "^1.0.1", "vue-cli-plugin-element": "^1.0.1",
"vue-template-compiler": "^2.6.11" "vue-template-compiler": "^2.6.11",
"workerize-loader": "^1.1.0"
} }
} }

View File

@ -85,8 +85,11 @@
</template> </template>
<script> <script>
//
"use strict";
const dec = require("./decrypt/common"); const worker = require("workerize-loader!./decrypt/common");
const dec = require('./decrypt/common');
export default { export default {
name: 'app', name: 'app',
components: {}, components: {},
@ -109,12 +112,25 @@
return this.cacheQueue.length; return this.cacheQueue.length;
} }
}, },
workers: [],
idle_workers: [],
thread_num: 1
} }
}, },
mounted() { mounted() {
this.$nextTick(function () { this.$nextTick(function () {
this.finishLoad(); this.finishLoad();
}); });
if (document.location.host !== "") {
this.thread_num = Math.max(navigator.hardwareConcurrency, 1);
for (let i = 0; i < this.thread_num; i++) {
this.workers.push(worker().CommonDecrypt);
this.idle_workers.push(i);
}
} else {
this.workers.push(dec.CommonDecrypt);
this.idle_workers.push(0)
}
}, },
methods: { methods: {
finishLoad() { finishLoad() {
@ -130,43 +146,25 @@
}); });
}, },
handleFile(file) { handleFile(file) {
// // worker
if (file) { if (this.idle_workers.length > 0) {
console.log("workCount", this.workCount); this.handleDoFile(file, this.idle_workers.shift());
// 100
if (this.workCount < 100) {
//
this.workCount++;
// 100
this.handleDoFile(file);
}
// 100
else {
this.cacheQueueOption.push(file);
}
} }
// // worker
else { else {
this.workCount++; this.cacheQueueOption.push(file);
this.handleDoFile(this.cacheQueueOption.pop());
} }
}, },
handleCacheQueue() { handleCacheQueue(worker_id) {
// 50 //
if (this.cacheQueueOption.size() > 0 && this.workCount < 50) { if (this.cacheQueue.length === 0) {
this.handleFile(null); this.idle_workers.push(worker_id);
console.log("size", this.cacheQueueOption.size(), this.workCount); return
} }
this.handleDoFile(this.cacheQueueOption.pop(), worker_id);
}, },
handleDoFile(file) { handleDoFile(file, worker_id) {
(async () => { this.workers[worker_id](file).then(data => {
let data = await dec.CommonDecrypt(file);
//
this.workCount--;
this.handleCacheQueue();
if (data.status) { if (data.status) {
this.tableData.push(data); this.tableData.push(data);
this.$notify.success({ this.$notify.success({
@ -186,7 +184,13 @@
}); });
window._paq.push(["trackEvent", "Error", data.message, file.name]); window._paq.push(["trackEvent", "Error", data.message, file.name]);
} }
})(); // todo: call stack
this.handleCacheQueue(worker_id);
}).catch(err => {
console.error(err, file);
window._paq.push(["trackEvent", "Error", err, file.name]);
this.handleCacheQueue(worker_id);
})
}, },
handlePlay(index, row) { handlePlay(index, row) {
this.playing_url = row.file; this.playing_url = row.file;
@ -250,6 +254,7 @@
font-size: small; font-size: small;
} }
/*noinspection CssUnusedSymbol*/
.el-upload-dragger { .el-upload-dragger {
width: 80vw !important; width: 80vw !important;
} }

View File

@ -4,9 +4,8 @@ const RawDecrypt = require("./raw");
const MFlacDecrypt = require("./mflac"); const MFlacDecrypt = require("./mflac");
const TmDecrypt = require("./tm"); const TmDecrypt = require("./tm");
export {CommonDecrypt}
async function CommonDecrypt(file) { export async function CommonDecrypt(file) {
let raw_ext = file.name.substring(file.name.lastIndexOf(".") + 1, file.name.length).toLowerCase(); let raw_ext = file.name.substring(file.name.lastIndexOf(".") + 1, file.name.length).toLowerCase();
let raw_filename = file.name.substring(0, file.name.lastIndexOf(".")); let raw_filename = file.name.substring(0, file.name.lastIndexOf("."));
let rt_data; let rt_data;