我正在尝试创建Web Workers并在周期中向他们发布消息:
array.forEach(function (data) {
this.createWorker();
this.workers[this.workersPointer].postMessage({task: 'someTask', data: string});
}, this);
createWorker函数:
createWorker: function () {
this.workersPointer++;
var worker = this.workers[this.workersPointer] = new Worker('Worker.js'),
storage = this;
worker.onmessage = function (event) {
if (event.data.error) {
storage[event.data.task + 'Errback'](event.data.error);
}
else {
storage[event.data.task + 'Callback'](event.data.data);
}
};
worker.onerror = function (error) {
storage.workerErrback(error);
};
}
工人代码:
self.addEventListener('message', function (event) {
self.postMessage({
data: data,
error: err,
task: event.data.task
});
},false);
它在Google Chrome中完美运行。当我尝试在Firefox中运行它时,它只能运行20次。 Firefox网络工作者有限制吗?我在mozilla.org上找不到有关它的信息。如果没有限制,问题是什么?有什么想法吗?
答案 0 :(得分:6)
Firefox中有一个名为“dom.workers.maxPerDomain”的设置,默认情况下为20.
但是,使用更多工作人员可能没有任何真正的性能提升,而不是计算机中的核心。如今的现代计算机具有超线程,我认为使用大约8名工人就足够了。否则,您可能会导致更多的上下文切换,而不会引入瓶颈。
这完全取决于你想要实现的目标。
答案 1 :(得分:5)
刚做了一些我自己的测试。为此,我稍微更改了代码:
周期:
for(var i=0;i<200;i++){
this.createWorker();
this.workers[this.workersPointer].postMessage({task: 'someTask', number:i});
};
createWorker函数:
this.workers =[];
this.workersPointer = 0;
storage=[];
var createWorker= function () {
workersPointer++;
var myPointer = workersPointer;
var worker = this.workers[this.workersPointer] = new Worker('Worker.js');
worker.onmessage = function (event) {
if (event.data.error) {
alert(event.data.error);
}
else {
document.cookie=event.data.task+"["+myPointer+"]="+event.data.number;
}
};
worker.onerror = function (event) {
alert("Error: " + event.error);
};
}
工人:
onmessage = function(event) {
postMessage({number:event.data.number*2, task: event.data.task});
};
在我运行之后,在chrome中我有66个cookie(包括一个漂亮的蓝色崩溃窗口),在firefox中我得到了20个。所以这两个浏览器似乎都有工作者限制。
编辑:
在Opera中我收到一条控制台消息:
此窗口超出了最大Web Worker实例数(16)。
答案 2 :(得分:1)
有关Firefox中的更多参考资料
关于:配置
有一个名为的参数:
dom.workers.maxPerDomain
Wich(至少在FF 33中)被设置为默认值20。
GL
正如this other stackoverflow question:
所述每个浏览器都有网络工作者限制(Firefox有20个,Chrome 60+,Opera 16);但是,您可以在Firefox中更改它 - &gt; dom.workers.maxPerDomain;至于你的实际问题,如果你能够或不能避免这种限制,我不确定。 “工人(这里称之为背景脚本)相对较重,并不打算大量使用。”你能给出一个你想要使用超过20名工人的确切情况吗? - Marius Balaban 2012年11月26日22:34
答案 3 :(得分:0)
我还和工作人员一起玩,并试图找到适合我的情况(字符串加密)。它也是8。
类似的问题和讨论:Number of Web Workers Limit