2012-02-18 15 views
6

Im cercando di creare lavoratori web e inviare messaggi a loro in ciclo:Esiste un limite per i lavoratori di Firefox?

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

funzione createWorker: codice

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

Worker:

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 web worker di Firefox hanno un limite? Non riesco a trovare informazioni su di esso su mozilla.org. Se non c'è limite, qual è il problema? Qualche idea?

risposta

5

Ho appena fatto qualche test per conto mio. Per questo, ho cambiato il codice un po ':

Cycle:

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

Worker:

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

Dopo ho eseguito questo, in cromo ho 66 biscotti (inclusa una bella finestra blu di crash), in firefox ne ho 20. Quindi entrambi i browser sembrano avere worker lim itations.

EDIT:

In Opera ottengo un messaggio di console:

Numero massimo di istanze Web Worker (16) ha superato per questa finestra.

+0

semplicemente mi chiedo, perché non ho trovato nulla in Google con la query "limite di Firefox Web Workers" ... E perché non ci sono messaggi di errore in Firefox e Chrome. –

+0

Ecco un bug chromium inviare: http://code.google.com/p/chromium/issues/detail?id=37518 – Alex

+4

Non c'è nessun messaggio di errore perché se si creano più lavoratori del limite vengono semplicemente messi in coda per correre. Il limite è per i lavoratori in esecuzione contemporaneamente, non per i lavoratori totali. Se stavi installando dei lavoratori che in realtà sono terminati, vedresti iniziare quelli in coda. Ma stai cercando di creare 200 lavoratori tutti con una durata infinita ... –

6

C'è un'impostazione in Firefox, chiamata "dom.workers.maxPerDomain" che è per default 20.

Tuttavia, potrebbe non esserci alcun reale guadagno di prestazioni nell'utilizzo di più lavoratori di quello che hai core del computer. Oggi, con un computer moderno con hyper threading, penso che utilizzare circa 8 lavoratori sia sufficiente. Altrimenti si potrebbe causare un elevato cambio di contesto che invece introdurrebbe un collo di bottiglia.

Tutto dipende però da ciò che si desidera ottenere.

+1

Questo è vero, se fai qualche calcolo reale all'interno del lavoratore. Ma se stai facendo chiamate ajax lente, questo potrebbe diventare un vero limite. – Alex

0

Ho anche giocato con gli operai e ho cercato di trovare un ottimo per il mio caso (crittografia delle stringhe). Era anche l'8.

stessa interrogazione e discussione: Number of Web Workers Limit

1

Per riferimento futher controllare in Firefox

about: config

C'è un parametro chiamato:

dom.workers .maxPerDomain

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

gl.

E come indicato sul this other stackoverflow question:

Ogni browser ha dei limiti lavoratori web (Firefox ha 20, Chrome 60+, Opera 16); tuttavia, puoi cambiarlo in Firefox -> dom.workers.maxPerDomain; per quanto riguarda la tua domanda reale, se puoi o non puoi evitare questa limitazione, non ne sono sicuro. "I lavoratori (come qui vengono chiamati questi script in background) sono relativamente pesanti e non sono pensati per essere utilizzati in grandi quantità." Puoi dare una situazione esatta in cui vorresti utilizzare più di 20 lavoratori? - Marius Balaban 26 novembre 12 alle 22:34

Problemi correlati