Существует ли ограничение Firefox Workers? - PullRequest
6 голосов
/ 18 февраля 2012

Я пытаюсь создать веб-работников и отправлять им сообщения в цикле:

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.Если нет предела, в чем проблема?Есть идеи?

Ответы [ 4 ]

6 голосов
/ 18 февраля 2012

В Firefox есть настройка, которая называется "dom.workers.maxPerDomain" и по умолчанию составляет 20.

Однако при использовании большего количества рабочих может не быть реального прироста производительности, чем у ядер вкомпьютер.Я думаю, что в условиях современного компьютера с гиперпоточностью я бы использовал 8 рабочих.В противном случае вы можете вызвать много переключений контекста, что приведет к появлению узкого места.

Однако все зависит от того, чего вы хотите достичь.

5 голосов
/ 18 февраля 2012

Только что сделал мой собственный тест.Для этого я немного изменил код:

Цикл:

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) для этого окна.

1 голос
/ 09 ноября 2014

Для дальнейшего ознакомления проверьте в Firefox

о: конфигурации

Есть параметр с именем:

dom.workers.maxPerDomain

У которого (по крайней мере, в FF 33) по умолчанию установлено значение 20.

гл.

И, как отмечалось на , этот другой вопрос о стеке потока:

Каждый браузер имеет ограничения для веб-работников (Firefox имеет 20, Chrome 60+, Opera 16); однако вы можете изменить его в Firefox -> dom.workers.maxPerDomain; Что касается вашего реального вопроса, если вы можете или не можете избежать этого ограничения, я не уверен. «Рабочие (как эти базовые сценарии называются здесь) являются относительно тяжелыми и не предназначены для использования в больших количествах». Можете ли вы дать точную ситуацию, когда вы хотели бы использовать более 20 работников? - Мариус Балабан 26 ноября 12 года в 22:34

0 голосов
/ 15 июля 2013

Я также играл с рабочими и пытался найти оптимальный для моего случая (шифрование строк).Это тоже было 8.

Аналогичный вопрос и обсуждение: Ограничение числа веб-работников

...