मैं एक वेब ऐप बना रहा हूं जो मल्टीपार्ट अपलोड का उपयोग करके अमेज़ॅन एस 3 में बड़ी फाइलें अपलोड करने के लिए इवापोरेटजेएस का उपयोग करता है। मैंने एक मुद्दा देखा जहां हर बार एक नया हिस्सा शुरू किया गया था, ब्राउज़र ~ 2 सेकंड के लिए स्थिर हो जाएगा। मैं चाहता हूं कि उपयोगकर्ता प्रगति पर होने पर मेरे ऐप का उपयोग जारी रखने में सक्षम हो, और यह ठंडा करने से यह एक बुरा अनुभव बन जाता है।क्रोम में वर्कर अवरुद्ध यूआई थ्रेड
मैंने क्रोम की टाइमलाइन का उपयोग यह देखने के लिए किया कि यह क्या कारण था और यह पाया कि यह स्पार्कएमडी 5 की हैशिंग थी। तो मैंने पूरी अपलोड प्रक्रिया को एक वर्कर में स्थानांतरित कर दिया है, जिसे मैंने सोचा था कि इस मुद्दे को ठीक करेगा।
वैसे समस्या अब एज और फ़ायरफ़ॉक्स में तय की गई है, लेकिन क्रोम अभी भी एक ही समस्या है।
आप देख सकते हैं, फ्रीज़ के दौरान मेरी मुख्य थ्रेड मूल रूप से कुछ भी नहीं जावास्क्रिप्ट का < 8ms उस समय के दौरान चल रहे के साथ कर रही है,:
यहाँ मेरी समय का एक स्क्रीनशॉट है। मेरे काम को मेरे वर्कर थ्रेड में हो रहा है, और यहां तक कि यह केवल ~ 600ms या उसके लिए चल रहा है, न कि 1386ms जो मेरा फ्रेम लेता है।
मुझे सच में यकीन नहीं है कि समस्या का कारण क्या है, क्या ऐसे श्रमिकों के साथ कोई गठिया है जिन्हें मुझे अवगत होना चाहिए?
var window = self; // For Worker-unaware scripts
// Shim to make Evaporate work in a Worker
var document = {
createElement: function() {
var href = undefined;
var elm = {
set href(url) {
var obj = new URL(url);
elm.protocol = obj.protocol;
elm.hostname = obj.hostname;
elm.pathname = obj.pathname;
elm.port = obj.port;
elm.search = obj.search;
elm.hash = obj.hash;
elm.host = obj.host;
href = url;
},
get href() {
return href;
},
protocol: undefined,
hostname: undefined,
pathname: undefined,
port: undefined,
search: undefined,
hash: undefined,
host: undefined
};
return elm;
}
};
importScripts("/lib/sha256/sha256.min.js");
importScripts("/lib/spark-md5/spark-md5.min.js");
importScripts("/lib/url-parse/url-parse.js");
importScripts("/lib/xmldom/xmldom.js");
importScripts("/lib/evaporate/evaporate.js");
DOMParser = self.xmldom.DOMParser;
var defaultConfig = {
computeContentMd5: true,
cryptoMd5Method: function (data) { return btoa(SparkMD5.ArrayBuffer.hash(data, true)); },
cryptoHexEncodedHash256: sha256,
awsSignatureVersion: "4",
awsRegion: undefined,
aws_url: "https://s3-ap-southeast-2.amazonaws.com",
aws_key: undefined,
customAuthMethod: function(signParams, signHeaders, stringToSign, timestamp, awsRequest) {
return new Promise(function(resolve, reject) {
var signingRequestId = currentSigningRequestId++;
postMessage(["signingRequest", signingRequestId, signParams.videoId, timestamp, awsRequest.signer.canonicalRequest()]);
queuedSigningRequests[signingRequestId] = function(signature) {
queuedSigningRequests[signingRequestId] = undefined;
if(signature) {
resolve(signature);
} else {
reject();
}
}
});
},
//logging: false,
bucket: undefined,
allowS3ExistenceOptimization: false,
maxConcurrentParts: 5
}
var currentSigningRequestId = 0;
var queuedSigningRequests = [];
var e = undefined;
var filekey = undefined;
onmessage = function(e) {
var messageType = e.data[0];
switch(messageType) {
case "init":
var globalConfig = {};
for(var k in defaultConfig) {
globalConfig[k] = defaultConfig[k];
}
for(var k in e.data[1]) {
globalConfig[k] = e.data[1][k];
}
var uploadConfig = e.data[2];
Evaporate.create(globalConfig).then(function(evaporate) {
var e = evaporate;
filekey = globalConfig.bucket + "/" + uploadConfig.name;
uploadConfig.progress = function(p, stats) {
postMessage(["progress", p, stats]);
};
uploadConfig.complete = function(xhr, awsObjectKey, stats) {
postMessage(["complete", xhr, awsObjectKey, stats]);
}
uploadConfig.info = function(msg) {
postMessage(["info", msg]);
}
uploadConfig.warn = function(msg) {
postMessage(["warn", msg]);
}
uploadConfig.error = function(msg) {
postMessage(["error", msg]);
}
e.add(uploadConfig);
});
break;
case "pause":
e.pause(filekey);
break;
case "resume":
e.resume(filekey);
break;
case "cancel":
e.cancel(filekey);
break;
case "signature":
var signingRequestId = e.data[1];
var signature = e.data[2];
queuedSigningRequests[signingRequestId](signature);
break;
}
}
ध्यान दें कि यह बुला धागे पर निर्भर करता है एडब्ल्यूएस सार्वजनिक कुंजी, एडब्ल्यूएस बाल्टी नाम और एडब्ल्यूएस क्षेत्र, एडब्ल्यूएस वस्तु कुंजी और इनपुट फ़ाइल वस्तु के साथ यह प्रदान करने के लिए:
यहाँ मेरी वर्कर के लिए कोड है , जो सभी 'init' संदेश में प्रदान किए जाते हैं। जब इसे किसी हस्ताक्षरित हस्ताक्षर की आवश्यकता होती है, तो यह पैरेंट थ्रेड को 'signRequest' संदेश भेजता है, जो कि मेरे एपीआई के हस्ताक्षर समापन बिंदु से प्राप्त होने के बाद 'हस्ताक्षर' संदेश में हस्ताक्षर प्रदान करने की अपेक्षा की जाती है।
क्या यह मदद करता है? https://github.com/TTLabs/EvaporateJS/issues/257 – user650881
वास्तव में नहीं।मुझे EvaporateJS के ओवरहेड के बारे में पता है और मैं इसका उपयोग कर प्रदर्शन समस्याओं का सामना कर रहा था, यही वजह है कि मैंने वर्कर थ्रेड का उपयोग शुरू किया। मेरा सवाल यह है कि यूआई थ्रेड अभी भी ठंडा है, भले ही सभी काम एक कर्मचारी में हो रहा हो। –
जिज्ञासा से, क्या आपने कभी इसे हल किया है? – tony19