| | |
| | | <p>Aufgabe</p> |
| | | <p>Experimentiert mit verschiedenen Möglichkeiten von <code>Content-Length</code> und dem Vorhandensein von <code>res.end()</code>, mit längerer oder kürzerer <code>Content-Length</code> als der tatsächliche Body oder teilt den Body in zwei <code>res.write()</code> und verzögert künstlich mit einem setTimeout() den zweiten Teil und schaut euch im Browser bei den Entwickler-Tools die Timings der Response an.</p> |
| | | </section> |
| | | <section> |
| | | <h3>Worker Threads</h3> |
| | | </section> |
| | | <section> |
| | | <p>Was sind Worker Threads?</p> |
| | | <p>Eine bidirektionale nachrichten-basierte Implementierung von Multithreading in NodeJS</p> |
| | | </section> |
| | | <section> |
| | | <p>Beispiel:</p> |
| | | <pre> |
| | | <code class="js" data-trim data-line-numbers> |
| | | // Main Thread |
| | | const { Worker } = require('worker_threads'); |
| | | |
| | | const data = 'some data'; |
| | | |
| | | const worker = new Worker("path/to/worker.js", { workerData: data }); |
| | | |
| | | worker.on('message', message => console.log('Reply from Thread:', message)); |
| | | |
| | | // Worker Thread |
| | | const { workerData, parentPort } = require('worker_threads'); |
| | | |
| | | const result = workerData.toUpperCase(); |
| | | |
| | | parentPort.postMessage(result); |
| | | </code> |
| | | </pre> |
| | | </section> |
| | | <section> |
| | | <p>Weitere nützliche Funktionen:</p> |
| | | <pre> |
| | | <code class="js" data-trim data-line-numbers> |
| | | // Main Thread |
| | | worker.on('message', message => processMessage(message)); |
| | | worker.on('error', error => console.error(error)); |
| | | |
| | | worker.postMessage({a: 1}); // send any data to the worker |
| | | |
| | | worker.terminate(); // manually terminate worker thread |
| | | |
| | | // Worker Thread |
| | | parentPort.on('message', message => doSomething(message)); // receive messages from the main thread |
| | | |
| | | process.exit(0); // terminate self, optionally with exit code |
| | | </code> |
| | | </pre> |
| | | </section> |
| | | <section> |
| | | <p>Aufgabe</p> |
| | | <p> |
| | | Nutze die in den <code>examples</code> vorhandene Funktion <code>isPrime</code> (010-nodejs/mt-main.js und 010-nodejs/mt-worker.js) und implementiere mit Hilfe der <code>Worker Threads</code> die Suche nach Primzahlen. |
| | | Die gewünschte maximale Zahl, bis zu der die Primzahlen gesucht werden sollen als auch die Anzahl der Threads, mit der gleichzeitig gesucht werden soll, sollen möglichst einfach parametrisierbar sein (einfache Variable im Code genügt). |
| | | |
| | | Probiert verschiedene Thread-Anzahlen aus und vergleicht einmal die benötigten Zeiten. |
| | | </p> |
| | | </section> |
| | | <section> |
| | | <p>Hinweise:</p> |
| | | <ul> |
| | | <li>Bei der Suche bis zu 1.000.000 und 8 Threads soll der erste Thread von 0 bis 125.000 suchen, der zweite von 125.000 bis 250.000 usw.</li> |
| | | <li>Nutzt Promises, um auf alle Ergebnisse warten zu können. (s. <code>Promise.all</code>)</li> |
| | | <li>per <code>workerData</code> können auch Objekte übergeben werden</li> |
| | | <li>Die gefundenen Primzahlen können ausgegeben werden, müssen aber nicht. In erster Linie geht es darum, die Arbeit auf mehrere Threads aufzuteilen.</li> |
| | | </ul> |
| | | </section> |
| | | </section> |
| | | </div> |
| | | </div> |