Domanda

Sto cercando di creare lavoratori web e pubblicare messaggi per loro in ciclo:

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

Funzione 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);
    };
}

Codice lavoratore:

self.addEventListener('message', function (event) {
self.postMessage({
    data: data,
    error: err,
    task: event.data.task
});

}, false);

Funziona perfettamente in Google Chrome. Quando sto cercando di eseguirlo in Firefox, funziona solo 20 volte. I lavoratori Web Firefox hanno un limite? Non riesco a trovare informazioni a riguardo su mozilla.org. Se non c'è limite, qual è il problema? Qualche idea?

È stato utile?

Soluzione

Ho appena fatto qualche prova. Per questo, ho cambiato un po 'il codice:

Ciclo:

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

Funzione 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);
    };
}

Lavoratore:

onmessage = function(event) {
    postMessage({number:event.data.number*2, task: event.data.task});
};

Dopo aver eseguito questo, in Chrome ho ottenuto 66 biscotti (tra cui una bella finestra di crash blu), a Firefox ho ottenuto 20. Quindi entrambi i browser sembrano avere limitazioni dei lavoratori.

MODIFICARE:

In Opera ricevo un messaggio console:

Numero massimo di istanze del Web Working (16) superate per questa finestra.

Altri suggerimenti

Esiste un'impostazione in Firefox, chiamata "Dom.workers.maxperDomain" che è per impostazione predefinita 20.

Tuttavia, potrebbe non esserci alcun guadagno di prestazioni reali nell'uso di più lavoratori di quelli che hai core nel computer. Con un computer moderno oggi che ha un threading iper, penso che usare circa 8 lavoratori sarebbe sufficiente. Altrimenti potresti causare un grande cambio di contesto che introdurrebbe invece un collo di bottiglia.

Tutto dipende, però, ciò che vuoi ottenere.

Per il check -out di riferimento a Firefox

Informazioni su: config

C'è un parametro chiamato:

Dom.Workers.maxperDomain

Che (almeno in FF 33) è impostato su un valore predefinito di 20.

GL.

E come notato su Quest'altra domanda stackoverflow:

Ogni browser ha limitazioni dei lavoratori web (Firefox ha 20, Chrome 60+, Opera 16); Tuttavia, puoi cambiarlo in Firefox -> dom.workers.maxperdomain; Per quanto riguarda la tua vera domanda, se puoi o non puoi evitare questa limitazione, non ne sono sicuro. "I lavoratori (poiché questi script di fondo sono chiamati nel presente documento) sono relativamente pesanti e non sono destinati ad essere utilizzati in gran numero." Puoi dare una situazione esatta in cui vorresti utilizzare più di 20 lavoratori? - Marius Balaban 26 novembre 12 alle 22:34

Ho anche giocato con i lavoratori e ho cercato di trovare un ottimale per il mio caso (crittografia delle stringhe). Erano anche 8.

Domanda e discussione simili: Numero di Web Workers Limit

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top