Съществува ли ограничение за работниците на Firefox?

Опитвам се да създам уеб работници и да публикувам съобщения до тях в цикъл:

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 бисквитки (включително хубав син прозорец за срив), във firefox получих 20. Така че и двата браузъра изглежда имат работни ограничения.

РЕДАКТИРАНЕ:

В Opera получавам конзолно съобщение:

Максималният брой екземпляри на Web Worker (16) е надвишен за този прозорец.

person Alex    schedule 18.02.2012
comment
просто се чудя защо не намерих нищо в Google със заявката за ограничение на firefox web works... И защо няма съобщения за грешка във Firefox и Chrome. - person Alex Savin; 18.02.2012
comment
Ето съобщение за грешка в Chromium: 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.

Възможно е обаче да няма реално увеличение на производителността при използване на повече работници, отколкото имате ядра в компютъра. С модерен компютър днес, който има хипер резба, мисля, че използването на около 8 работници би било достатъчно. В противен случай може да причините много превключване на контекста, което вместо това ще доведе до пречка.

Всичко обаче зависи от това какво искате да постигнете.

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

За допълнителна справка проверете във Firefox

about:config

Има параметър, наречен:

dom.workers.maxPerDomain

Което (поне във FF 33) е зададено на стойност по подразбиране 20.

gl.

И както е отбелязано в този друг въпрос за stackoverflow:

Всеки браузър има ограничения за уеб работници (Firefox има 20, Chrome 60+, Opera 16); можете обаче да го промените във Firefox -> dom.workers.maxPerDomain; що се отнася до действителния ви въпрос, дали можете или не можете да избегнете това ограничение, не съм сигурен. „Работниците (както тези фонови скриптове се наричат ​​тук) са относително тежки и не са предназначени да се използват в големи количества.“ Можете ли да посочите точна ситуация, при която бихте искали да използвате повече от 20 работници? – Marius Balaban 26 ноември '12 в 22:34

person Paulo Bueno    schedule 09.11.2014

Аз също си поиграх с работници и се опитах да намеря оптимално за моя случай (криптиране на низове). Беше и 8.

Подобен въпрос и дискусия: Ограничение за брой уеб работници

person Björn Weinbrenner    schedule 14.07.2013