我正在尝试加快与网络 worker 合作建立的javascript网站的速度。这对我来说是全新的,我正在学习。
我设法让这个网络 worker 运行并执行应做的事情(即加载一些CSV数据,对其进行转换并将其发送回去)。
但是在我看来,这个网络 worker 开始他的工作有点太晚了(我将postMessage发送给他后大约500毫秒)
这正常吗?
worker 怎么不早点开始呢?
我能做些什么 ?
这是 worker :
self.postMessage('A. !!! Worker on');
self.onmessage = function(event) {
var n=event.data;
self.postMessage('['+n+'] B. Worker started');
// (...)
}
这是工作人员的处理方法:
window.timer = Date.now();
window.timerTotal = window.timer;
function loadData(n){
console.log('A. !!! Begin loadData function (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
var worker = new Worker('my_task.js');
worker.onmessage = function(event) {
if ( (typeof event.data)==='string'){
console.log('Web Worker: ' + event.data + ' (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
}
else if ( (typeof event.data)==='object'){
console.log('!!! Web Worker returned object: (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
createGraphs2(event.data);
}
};
if(n===100){
d3.csv("data/Movies100-V2.0.csv", function(error, data_csv) {
createGraphs(data_csv);
});
}
else if(n==='10k'){
worker.postMessage(n);
console.log('postMessage send to web worker (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
}
}
loadData('10k');
// (...) lots of functions like createGraphs2(data)
这是日志:
谢谢!
更新:
当我启动VeryLongScript的同时向工作人员发送postMessage时:
veryLongScript();
worker.postMessage(n);
在大多数情况下,工作人员会在veryLongScript之后做出响应。
有时工作人员会在veryLongScript之前和之后做出响应,但似乎无法并行工作。
最佳答案
当您通过以下方式创建新工作人员时
new Worker('my_task.js');
仅在这一点上,浏览器才向服务器发出请求,要求
my_task.js
在工作程序中运行。然后,您正在等待服务器发出并返回请求,以及正在启动的工作程序。我在http://plnkr.co/edit/MlabLs4HafnIscBbnPJv?p=preview上做了一个简化的代码示例。对我来说,它报告启动一个Chrome的 worker 大约需要130ms的时间。但是,网络检查器指出,获取脚本大约需要90毫秒。因此,为 worker 的实际启动时间留出40毫秒的时间。
我怀疑您报告的500毫秒中的大多数实际上是从服务器获取工作程序脚本所花费的时间。
我的建议是
或者,您可以避免将worker作为单独的文件,而将代码内联并将其转换为Data URI,如https://stackoverflow.com/a/6454685/1319998所述。 但是如https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers所述
因此,我会谨慎地在您要支持的浏览器上进行测试。
关于javascript - 让网络 worker 尽快启动,刻不容缓,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30275218/