2012-02-18 23 views
6

Im próbuje utworzyć Pracownicy internetowych i wysyłać wiadomości do nich w cyklu:Czy istnieje limit pracowników Firefoksa?

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

funkcja createWorker: Kod

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

Pracownik:

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

}, false);

Działa doskonale w Google Chrome. Kiedy próbuję uruchomić go w Firefoksie, działa tylko 20 razy. Czy pracownicy przeglądarki Firefox mają limit? Nie mogę znaleźć informacji na ten temat na mozilla.org. Jeśli nie ma limitu, jaki jest problem? Jakieś pomysły?

Odpowiedz

5

Po prostu zrobiłem kilka własnych testów. W tym Zmieniłem kod trochę:

Cykl:

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

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

Pracownik:

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

Po biegnę to w chromie Mam 66 ciasteczek (w tym ładne niebieskie okno awarii), w FireFox mam 20. Tak więc obie przeglądarki wydają się mieć ograniczoną liczbę pracowników itacje.

EDIT:

W operze pojawia się komunikat konsoli:

maksymalną liczbę instancji Web Worker (16) przekroczyła w tym oknie.

+0

Po prostu zastanawiam się, dlaczego nie znalazłem nic w Google z zapytaniem "limit pracowników sieci firefox" ... I dlaczego nie ma komunikatów o błędach w Firefoksie i Chrome. –

+0

Oto zgłoszenie błędu w chromie: http://code.google.com/p/chromium/issues/detail?id=37518 – Alex

+4

Nie ma komunikatu o błędzie, ponieważ jeśli utworzysz więcej pracowników niż limit, po prostu dostaną się do kolejki do uruchomienia. Limit dotyczy jednocześnie pracowników, a nie pracowników ogółem. Jeśli konfigurowałeś pracowników, którzy faktycznie zakończyli pracę w pewnym momencie, zobaczysz, że kolejki zaczynają działać. Ale próbujesz skonfigurować 200 pracowników z nieskończonym życiem ... –

6

jest ustawienie w Firefoksie, zwany „dom.workers.maxPerDomain”, który jest domyślnie 20.

Jednak nie może być żadnych realnych przyrost wydajności w użyciu więcej pracowników niż masz rdzeni w komputer. W dzisiejszym nowoczesnym komputerze z hiperprzestrzenikiem, wystarczy użyć około 8 pracowników. W przeciwnym razie możesz spowodować znaczne przełączanie kontekstów, które zamiast tego wprowadzą wąskie gardło.

Wszystko zależy jednak od tego, co chcesz osiągnąć.

+1

To prawda, jeśli wykonasz jakieś prawdziwe obliczenia wewnątrz pracownika. Ale jeśli robisz wolne wywołania ajaxowe, może to być prawdziwym ograniczeniem. – Alex

0

Grałem też z pracownikami i próbowałem znaleźć optymalne dla mojej sprawy (szyfrowanie ciągów). To też było 8.

Podobne pytanie i dyskusja: Number of Web Workers Limit

1

w celu uzyskania dalszych odniesienia sprawdzeniu Firefox

about: config

Jest to parametr o nazwie:

dom.workers .maxPerDomain

Wich (przynajmniej w FF 33) jest ustawiona na wartość domyślną 20.

Gl.

I, jak wspomniano na this other stackoverflow question:

Każda przeglądarka ma ograniczenia pracowników internetowych (Firefox, Chrome ma 20 60+, opera 16); można go jednak zmienić w Firefoksie -> dom.workers.maxPerDomain; jeśli chodzi o twoje aktualne pytanie, jeśli nie możesz tego uniknąć, nie jestem pewien. "Pracownicy (ponieważ te skrypty w tle są tu nazywane) są stosunkowo ciężkie i nie są przeznaczone do użycia w dużych ilościach." Czy możesz podać dokładną sytuację, w której chciałbyś zatrudnić więcej niż 20 pracowników? - Marius Balaban 26 listopada o 22:34

Powiązane problemy