Существует ли ограничение Firefox 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
});

}, ложный);

Он отлично работает в Google Chrome. Когда я пытаюсь запустить его в Firefox, он работает только 20 раз. Есть ли у веб-работников Firefox ограничение? Я не могу найти информацию об этом на mozilla.org. Если нет предела, в чем проблема? Есть идеи?


person Alex Savin    schedule 18.02.2012    source источник


Ответы (4)


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

Цикл:

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).

person Alex    schedule 18.02.2012
comment
просто интересно, почему я ничего не нашел в Google с запросом ограничения веб-работников firefox ... И почему в Firefox и Chrome нет сообщений об ошибках. - person Alex Savin; 18.02.2012
comment
Вот сообщение об ошибке хрома: code.google.com/p/chromium. /issues/detail?id=37518 - person Alex; 18.02.2012
comment
Сообщение об ошибке не появляется, потому что, если вы создадите больше рабочих, чем лимит, они просто будут поставлены в очередь для запуска. Ограничение касается одновременно работающих воркеров, а не общего количества воркеров. Если бы вы настраивали воркеры, которые фактически завершились в какой-то момент, вы бы увидели, что те, что стоят в очереди, начинают работать. Но вы пытаетесь создать 200 рабочих с бесконечным сроком службы... - person Boris Zbarsky; 19.02.2012

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

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

Хотя все зависит от того, чего вы хотите добиться.

person jishi    schedule 18.02.2012
comment
Это верно, если вы выполняете какие-то реальные вычисления внутри работника. Но если вы делаете медленные вызовы ajax, это может стать настоящим ограничением. - person Alex; 18.02.2012

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

о: конфиг

Там параметр называется:

dom.workers.maxPerDomain

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

gl.

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

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

person Paulo Bueno    schedule 09.11.2014

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

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

person Björn Weinbrenner    schedule 14.07.2013