Neler olduğu hakkında en iyi tahminim. Her 1 ms'de bir Web Çalışanı'ndan bir mesaj göndererek, ana iş parçacığının her mesajın 1 ms içinde gönderilmesini talep ediyorsunuz. Ana iş parçacığı, iletiyi 1 ms içinde işleyemiyorsa, son iletiyi işlenmemiş olsa da yine de yeni bir ileti gönderiyorsunuz demektir. Bunun, işlenmeyi bekleyen mesajların kuyruğuna yerleştirdiğini düşünürdüm.
Artık web çalışanından işlenebileceklerinden daha hızlı mesajlar gönderiyorsunuz, işlenmemiş mesajların sırası daha da büyüyor. Bir noktada Chrome, ellerini fırlatacak ve "Kuyrukta çok fazla mesaj var" diyor ve işlemek için yeni mesajlar sıralamak yerine, bunları düşürüyor.
Bu nedenle, zaman aşımında 100 ms gibi makul bir sayı kullanırsanız, iletinin bir sonraki ileti gönderilmeden önce işlenmesi için çok zaman vardır ve işlenmemiş iletilerde sorun olmaz.
Ben işçi ana iş parçacığı bir mesaj gönderen bir jsFiddle oluşturduk ve ana iş parçacığı geri işçiye mesajı gönderir. Bir sonraki mesajın gönderilmesinden önce bu işlem gerçekleşmezse, her iki başlıktaki sayılar eşleşmez ve web çalışanı sonlandırılır. Sen 100ms makul bir setTimeout ile görebiliriz
http://jsfiddle.net/meovfpv3/3/
, tüm iletiler sonraki ileti oluşmadan önce işlemek için yeterli zamana sahip.
setTimeout öğesini 1 ms'ye düşürdüğünüzde, ileti zincirinin bir sonraki iletinin gönderilmesinden önce bitmesi ve her iş parçacığındaki sayaçların en sonunda, if
maddesini durdurması ve web çalışanını sonlandırması gerekir.Bu sorunu gidermek için
bir yolu yerine körlemesine mesaj sonuncusu işlenen veya geri ana iş parçacığı bir mesaj aldıktan sonra, sadece yeni mesaj gönder yapılmadığının her 1 msn'de gönderme taşımaktadır. Bu, yalnızca ana iş parçacığının bunları işleyebildiği kadar hızlı bir şekilde iletileri gönderdiğiniz anlamına gelir.
İşçi:
var counter2 = 0;
var rcvd = true;
function hi() {
counter2++;
console.log("")
console.log("postMessage", counter2)
postMessage(counter2);
if (!rcvd) {
self.close();
console.log("No message received");
}
rcvd = false;
setTimeout(hi, 1);
}
hi();
onmessage = function(e) {
rcvd = true;
console.log("secondMessage", e.data);
}
Ana: Öncelikle
var ww = document.querySelector('script[type="text/ww"]'),
code = ww.textContent,
blob = new Blob([code], {type: 'text/javascript'}),
blobUrl = URL.createObjectURL(blob),
worker = new Worker(blobUrl),
counter = 0;
worker.onmessage = function(e) {
counter++;
console.log("onmessage:", counter);
worker.postMessage(e.data);
}
Tabii nedenini açıklayabilir, ama bunu tahmin etmemizi sormayın. Test etmek için ** minimum doğrulanabilir bir örnek ** göstermeniz gerekecek. –
@IsmaelMiguel Soruyu worker.js koduyla güncelledim. Temelde ben bir dize dışında bir damla yapmak ve ben aynı sorunu yaşıyorum –
işçiye verin. Ben İşçi (a 'console.log' ile test) sona olmadığını tespit ettik onMessage geri arama sadece bir noktada ateş olmak durdurur. Çok garip ve kabul edilemez bir tarayıcı davranışı! * masa çevirme * –