是否存在Firefox Worker限制?

Ale*_*vin 6 javascript firefox web-worker

我试图创建Web Workers并在周期中向他们发布消息:

array.forEach(function (data) {
        this.createWorker();
        this.workers[this.workersPointer].postMessage({task: 'someTask', data: string});
    }, this);
Run Code Online (Sandbox Code Playgroud)

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);
    };
}
Run Code Online (Sandbox Code Playgroud)

工人代码:

self.addEventListener('message', function (event) {
self.postMessage({
    data: data,
    error: err,
    task: event.data.task
});
Run Code Online (Sandbox Code Playgroud)

},false);

它在Google Chrome中完美运行.当我尝试在Firefox中运行它时,它只能运行20次.Firefox网络工作者有限制吗?我在mozilla.org上找不到有关它的信息.如果没有限制,问题是什么?有任何想法吗?

jis*_*shi 6

Firefox中有一个名为"dom.workers.maxPerDomain"的设置,默认情况下为20.

但是,使用更多工作人员可能没有任何真正的性能提升,而不是计算机中的核心.如今的现代计算机具有超线程,我认为使用大约8名工人就足够了.否则,您可能会导致更多的上下文切换,而不会引入瓶颈.

这一切都取决于你想要实现的目标.


Ale*_*lex 5

刚做了一些我自己的测试.为此,我改变了一点代码:

周期:

for(var i=0;i<200;i++){
   this.createWorker();
   this.workers[this.workersPointer].postMessage({task: 'someTask', number:i});
};
Run Code Online (Sandbox Code Playgroud)

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);
    };
}
Run Code Online (Sandbox Code Playgroud)

工人:

onmessage = function(event) {
    postMessage({number:event.data.number*2, task: event.data.task});
};
Run Code Online (Sandbox Code Playgroud)

在我运行之后,在chrome中我有66个cookie(包括一个漂亮的蓝色崩溃窗口),在firefox中我得到了20个.所以这两个浏览器似乎都有工作者限制.

编辑:

在Opera中我得到一个控制台消息:

此窗口超出了最大Web Worker实例数(16).

  • 没有错误消息,因为如果您创建的工作人员数量超过限制,他们就会排队等待运行.限制是同时运行的工人,而不是总工人.如果您正在设置实际在某个时刻终止的工作程序,您会看到排队的工作程序开始运行.但你正试图建立200名工人,他们都有无限的生命...... (4认同)