2016-04-10 6 views
2

私は、WebワーカーとJavaScriptのマルチスレッド/並行性について検討しています。 私は、以下のプログラムに2人のjavascriptウェブワーカーが出力を連続して印刷します - なぜ同時にできませんか?

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

を実行することによって自分自身にそれを "証明" しようとしています
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); 
    } 
} 

main.jsのすべてのconsole.logステートメントが最初に印刷され、次にworker.jsのすべてのconsole.logステートメントが印刷されます。私が思っただろう何

Console.log screenshop

プリントアウトは、例えば散在するだろうということです

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 

なぜこれが起こっていないのですか?上記のようにこれを示す方法はありますか?

+0

「チョークポイント」として機能する 'console'メカニズムかもしれません。 – Pointy

+0

@Pointyはい、そうだったようです。 – user1714161

答えて

2

私は専門家ではないんだけど、ここに私の推測です:

postMessageは非同期です。あなたがそれを呼び出すと、のメッセージを送信し、現在の「スレッド」(すなわち「ログ500コンソールメッセージ」ビット)が終了したときに実際に送信されます。その時点で、ワーカーにメッセージを送信することができます。メッセージはワーカー自身のメッセージを記録することができます。

これをテストするには、ループの周りにsetTimeout(function() { ... }, 1);をラップしてみてください...理論的には、作業者のメッセージが最初に表示され、次にメインスレッドが表示されるはずです。

+0

ご返信ありがとうございます。私は両方の "スレッド"が主なものの前にワーカー1ではなく同時に実行されるのを探していました。私が見つけた解決策は、1つではなく2つの作業者を作成し、forループをmain.jsから新しい作業者に移動することでした。後でコードを投稿します。 – user1714161

関連する問題