2016-04-10 16 views
2

JavaScript'te web işçilerine ve çoklu iş parçacığına/eşzamanlılıklara bakıyorum. Aşağıdaki programlarİki javascript web işcisi art arda çıktı alır - Neden aynı anda değil?

HTML

<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <title>Worker 2</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
    <script src="main.js"></script> 
</head> 
<body> 
</body> 
</html> 

main.js

var myFunction = function() { 

    worker = new Worker('worker.js'); 

    worker.postMessage('cowboy'); 

    for (var i=0; i<500; i++) { 
     var d = new Date(); 
     var h = d.getHours(); 
     var m = d.getMinutes(); 
     var s = d.getSeconds(); 
     var ms = d.getMilliseconds(); 
     console.log("main: " + h + ":" + m + ":" + s + ":" + ms); 
    } 

}; 
window.onload=myFunction; 

worker.js çalıştırarak kendime "kanıtlamak" çalışıyorum

self.addEventListener('message', receiveMessage); 

function receiveMessage(e) { 
    for (var i=0; i<500; i++) { 
     var d = new Date(); 
     var h = d.getHours(); // => 9 
     var m = d.getMinutes(); // => 30 
     var s = d.getSeconds(); // => 51 
     var ms = d.getMilliseconds(); 
     console.log("worker: " + h + " " + m + ":" + s + ":" + ms); 
    } 
} 

Olanak şu: main.js'deki tüm console.log deyimleri önce yazdırılır, daha sonra worker.js'den tüm konsol.log deyimleri örn.

Console.log screenshop

Ne sanırdım çıktılar örneğin serpiştirilmiş olacağı olup

main: 21:50:10:707 
worker: 21 50:10:708 
main: 21:50:10:709 
main: 21:50:10:710 
worker: 21 50:10:711 
worker: 21 50:10:712 
worker: 21 50:10:713 
main: 21 50:10:714 

Bu neden olmuyor ve bunu yukarıdaki gibi göstermek için herhangi bir yol var mı?

+0

"Jikle noktası" olarak işlev gören "konsol" mekanizması olabilir. – Pointy

+0

@Pointy Evet, durum böyle görünüyor. – user1714161

cevap

2

ben bir uzman değilim, ama burada benim eğitimli tahminim var: asenkron

postMessage olduğunu. Bunu çağırdığınızda, kuyrukları gönderilecek ve aslında "thread" (yani "log 500 konsol mesajları" biti) bittiğinde gönderilecektir. Bu noktada, mesajı kendi mesajlarını kaydedebilecek olan işçiye göndermek ücretsizdir.

Bunu test etmek için, döngü etrafında setTimeout(function() { ... }, 1); paketlemeyi deneyin ... Teoride, şimdi işçinin mesajlarını, ardından ana iş parçacığını görmelisiniz.

+0

Cevabınız için teşekkür ederiz. Her iki "thread" için de aynı anda çalışan biri değil de aynı şekilde çalışacaktı. Bulduğum çözüm, bir yerine 2 işçiyi yapmak ve ana döngüden main.js'den yeni çalışana geçmek oldu. Kodu daha sonra gönderirim. – user1714161

İlgili konular