2016-04-10 7 views
2

Ich untersuche Webworkers und Multithreading/Parallelität in JavaScript. Ich versuche, es mir selbst zu "beweisen", indem Sie die folgenden ProgrammeZwei JavaScript Webworker drucken nacheinander - Warum nicht gleichzeitig?

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 läuft

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

Was passiert ist, dass alle console.log-Anweisungen von main.js zuerst gedruckt werden, dann alle console.log-Anweisungen von worker.js, z.

Console.log screenshop

Was hätte ich gedacht, dass die Ausdrucke zum Beispiel durchsetzt sein würde

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 

Warum passiert das nicht und gibt es eine Möglichkeit, dies wie oben zu demonstrieren?

+0

Es könnte der "Konsolen" -Mechanismus sein, der als "Engpass" fungiert. – Pointy

+0

@ Pointy Ja, es sieht so aus. – user1714161

Antwort

2

Ich bin kein Experte, aber hier ist meine fundierte Vermutung:

postMessage ist asynchron. Wenn Sie es anrufen, es Warteschlangen die zu sendende Nachricht, und es wird tatsächlich gesendet, wenn der aktuelle "Thread" (dh das "Protokoll 500 Konsolenmeldungen" Bit) beendet ist. An diesem Punkt ist es frei, die Nachricht an den Worker zu senden, der in der Lage sein wird, seine eigenen Nachrichten zu protokollieren.

Um dies zu testen, versuchen Sie, setTimeout(function() { ... }, 1); um die Schleife zu wickeln ... Theoretisch sollten Sie jetzt zuerst die Nachrichten des Arbeiters sehen, dann die Hauptthreads.

+0

Danke für Ihre Antwort. Ich suchte nach beiden "Threads", die gleichzeitig ausgeführt werden sollten, nicht nach dem "Worker", sondern vor dem "Main". Die Lösung, die ich gefunden habe, war, 2 Arbeiter anstelle von einem Arbeiter zu machen und die for-Schleife von der main.js auf den neuen Arbeiter zu verschieben. Ich werde den Code später veröffentlichen. – user1714161

Verwandte Themen