Auf den ersten Blick klingt die parallele Verarbeitung nach einer Einladung zum kostenlosen Mittagessen - Multi-Core-CPUs, der effizienter nutzen kann, sollte Ihrem Code einen enormen Geschwindigkeitsschub ergeben. Praktische Erfahrung zeigt, dass dies nicht immer der Fall ist: Einige Probleme sind nicht parallelen. Darüber hinaus führt die parallele Ausführung zu einer ganzen Familie neuer Probleme, die auf Single-Core-Maschinen nicht gesehen werden.
Parallelcode kann grundsätzlich in zwei Jobgruppen aufgeteilt werden. Die erste Gruppe ist klassischer Geschwindigkeitsanstieg - wenn Ihr Programm durch 3000 Bilder durchsetzen muss, bedeutet das Aufteilen der Berufsaufteilung, dass mehr Bilder zu einem bestimmten Zeitpunkt verarbeitet werden können. Während definitiv von Vorteil ist, wird diese Aufgabe in der täglichen Webentwicklung selten aufgetreten. (Wenn Sie eine bild-schwere Site erstellen, stellen Sie sicher, dass Sie sie mit anständig unterstützen Cloud-Speicherung. ).
Die häufigere Form des Parallelierungsauftrags arbeitet um langlaufende Aufgaben, die keine viel CPU-Zeit erfordern. Ein gutes Beispiel dafür würde darauf warten, auf einen Download oder eine Art von Geräteeingaben zu warten: Wenn dies parallel ausgeführt wird, muss der Rest der GUI nicht blockiert werden. Da die Benutzer dazu neigen, Probleme zu haben, ist das Verständnis von Problemen, warum die Schaltfläche nicht auf "klickt", kann dies zu einer erhöhten Benutzerzufriedenheit führen, auch wenn die tatsächliche Geschwindigkeit nicht erhöht.
Wenn Sie neue Ressourcen benötigen, um Ihnen beim Codieren von intelligenter zu helfen, überprüfen Sie unseren Leitfaden zum Besten Webdesign-Tools. von 2019. Wenn Sie den Code insgesamt vermeiden möchten, entwerfen Sie Ihre Site mit den Besten Webseitenersteller und stellen Sie sicher, dass Sie das perfekte gewählt haben Web-Hosting Service mit unserem Guide.
VAR SLEEP = ERFORDERLICH ('SLEEP');
Funktionsarbeiter () {
console.log ("achter up")
SLEEP.MSLEEP (1000)
console.log ("Worker Down")
}
SetInterval (Arbeiter, 2000);
während (1 == 1)
{
SLEEP.MSLEEP (250)
console.log ("Hallo von Main")
} & gt;
Lassen Sie uns mit einem kleinen Beispiel anfangen, das auf einem beliebten Favoriten basiert: das SetInterval. Funktion. Es dauert eine Funktionsreferenz und einen numerischen Wert, der in Millisekunden abgegrenzt ist. Danach wird die Funktion periodisch abgefeuert, wenn der Verzögerungstimer abläuft.
NPM Installieren Sie den Schlaf
NPM-Beispiel1.js
Verwendung der Schlaf() Funktion erfordert, dass wir das Schlafmodul auf ein lokales NPM-Projekt laden. Es fungiert als Schnittstelle zur Schlafbibliothek des Betriebssystems - fragen Sie sich nicht, ob der Compiler Ihres Workstation während des Einsatzes des Pakets abgefeuert wird.
Wenn Sie dieses Programm ausführen, werden Sie sich mit der Ausgabe ähnlich dem in der in diesem Schritt gezeigten Figur konfrontiert. Es ist offensichtlich, dass unser Arbeiter nie aufgerufen wird - etwas muss mit der SetInterval-Funktion falsch sein.
Moderne Browser rüsten jede Lasche mit einem JavaScript-Thread aus. Ein sorgfältiger Blick auf unsere Schleife zeigt, dass es endlos ist. Dies bedeutet, dass es für immer laufen wird, und wird niemals die Kontrolle bringen. Gegeben das SetInterval () Funktioniert mit einer Nachricht, deren Nutzlast wird nie ausgeführt, da der Nachrichtenhandler vom Laufen blockiert ist.
const bar = () = & gt; console.log ('bar')
const baz = () = & gt; console.log ('baz')
const foo = () = & gt; {
console.log ('foo')
Settimeout (Bar, 0)
baz ()
}
foo ()
Flavio Copes 'Blog , bietet ein äußerst interessantes Bit von Code, der das Problem darstellt. Wenn Sie laufen, ergibt es den in der Figur gezeigten Ausgabe, da die Nachrichtenwarteschlange bis blockiert wird foo () verzichten Sie auf die Kontrolle über den Hauptfaden.
Da das zugrunde liegende Betriebssystem ein preemptives Multitasking durchführen kann, nutzen Sie die Funktionen, indem Sie die Fäden über eine dedizierte API namens WEBworkers, die weitreichende Unterstützung genießen können. Die Figur, die diesen Schritt beiliegen, zeigt das aktuelle Liste für das Merkmal.
console.log ("Worker sagt Hallo!");
console.log ("achter up");
während (1 == 1)
{
console.log ("x");
}
Webworkers können nicht mit einer Funktionsbelastung auftreten. Stattdessen ist eine neue Datei erforderlich, die den Code enthält, der im Thread ausgeführt werden soll. Im Falle unseres Beispiels, Beispiel7Thread.js. Hat der Inhalt in diesem Schritt angezeigt.
const Worker = erfordern ('agecraft_threads');
var mywerder = new achter.arbeiter ('./
Beispiel7Thread.js ');
var myworker2 = neue arbeiter.arbeiter ('./
Beispiel7Thread.js ');
Unser Arbeiter ist bereit für die Prime-Time. Spezialitäten der Node.js Laufzeit zwingen uns, das Modul der Arbeiterfäden einzuschließen und einen relativen Pfad zu übergeben - Probleme, die nicht im Browser konfrontiert sind. Wundern Sie sich außerdem nicht über die Fehlender Start () Anruf - Ein Web-Arbeiter wird festgelegt, wenn die Instanz online ist.
Die Nachrichtenlieferung erfordert in der Regel eine Art Interaktion zwischen der Laufzeit und dem Rest des Betriebssystems. Leider blockiert unsere Endlosen-Schleife diesen Prozess - was bedeutet, dass nur einer der Nachrichten vor dem "großen Stand" auftaucht.
const Worker = erfordern ('agecraft_threads');
var mywerder = new achter.arbeiter ('./
Beispiel7Thread.js ');
var myworker2 = neue arbeiter.arbeiter ('./
Beispiel7Thread.js ');
während (1 == 1)
{
}
Ein anderes Experiment beinhaltet, eine leere Schleife nach den beiden Konstruktor-Invokationen zu platzieren. In diesem Fall beginnen die Threads niemals zu arbeiten - die Aufrufnachricht erscheint niemals mit dem Betriebssystem.
Während Arbeiter mit engen endlosen Schleifen führen, haben die oben ausgestellten Probleme, die Routinen miteinander kommunizieren können. Dies erfolgt über eine Nachrichtenüberschreitungsschnittstelle - denken Sie an eine Anlage, mit der Sie ein Nachrichtenobjekt von einem Absender an einen Empfänger über Fadengrenzen übertragen können.
Neben den Vorteilen, die Threads e ff eisig (und ein geringeres Risiko von "Kollisionen", auch als Rennbedingungen genannt) zu koordinieren Thread-Safe-GUI-Stapel.
Die Implementierungsnachricht in Node.js ist langweilig. Bewegen Sie den Code in das Web - Beginnen Sie mit einem HTML-Kabelbaum, der lädt examplempi.js. . Beachten Sie, dass dieser Code aufgrund von DOM-Ursprungseinschränkungen nur von einem LocalHost-Webserver ausgeführt werden kann.
var myworkerer = neue Arbeiter ('./
examplempithread.js ');
var myworker2 = neuer Arbeiter ('./
examplempithread.js ');
myworker.onmessage = Funktion (e)
{
console.log (e);
}
myworker2.onmessage = Funktion (e)
{
console.log (e);
}
Jeder Arbeiter legt eine OnMessage-Eigenschaft aus, die eine Funktionsreferenz aufnimmt, die aufgerufen werden muss, wenn eine Nachricht vom anderen Ende auftaucht. Incoming-Meldungen werden einfach an die Konsole des Browsers vom Hauptfaden weitergeleitet.
Postmessage ("Arbeiter sagt Hallo!");
Postmessage ("Arbeiter up");
während (1 == 1)
{
Postmessage ("x");
}
Das Senden von Nachrichten an ein Mailbox wird durch Aufrufen der Funktion Postnachricht erreicht. Denken Sie daran, dass ein Arbeiter auch einen implementieren kann Onmessage. Ereignis, das Informationen von der Whover-Instanzobjekt-Objekte erhalten könnte.
Zu diesem Zeitpunkt ist der Code einsatzbereit. Die Entwicklerkonsole ist aufgrund der hohen E-FF-Persicity der MPI-Schnittstelle nicht mit Nachrichten überschwemmt, was dabei, dass Daten um das System e ff icienty reisen können.
Microsofts Hinzufügung des Asyncs und warte auf Keywords die Geschichte von C # und VisualBasic.net. Prinzipiell wird ein Async-Verfahren mit dem Rest des Programms kooperativ ausgeführt. Die Ergebnisse können dann über die erwartete Funktion geerntet werden.
const Sleep = (Millisekunden) = & gt; {
neues Versprechen zurückgeben (Resolve = & gt;
Settimeout (Auflösung, Millisekunden))
}
Da die Browser bei schweren Einschränkungen bei den nativen Funktionen unterliegen, können wir die bereits erwähnte Schlaffunktion nicht wiederverwenden. Darüber hinaus ist es suboptimal, daß es die gesamte Node.js-Laufzeit anhält. Das Snippet, das diesen Schritt begleitet, bietet einen effektiveren Ansatz.
Dieser Code gibt ein Versprechenobjekt zurück - es ist eine andere Convenience-Klasse, die Java-Skript in einem Versuch, Multithreading einfacher zu gestalten, hinzugefügt. Sie müssen seine Resolve-Methode über a aufrufen Settimeout , um sicherzustellen, dass der Code ziemlich zeitlich "herausrichten muss.
Auf Anrufe sind nur in asynchronisierten Funktionen erlaubt. Dies bedeutet, dass der Arbeiter eine Umschreibung benötigt - beginnen Sie, indem Sie eine asynchronische Trägerfunktion aufrufen. Es handhabt den Rest der Code-Interaktion.
CONDE SLEEP = (Millisekunden) = & gt; {
neues Versprechen zurückgeben (Resolve = & gt;
Settimeout (Auflösung, Millisekunden))
}
Postmessage ("Arbeiter sagt Hallo!");
Postmessage ("Arbeiter up");
Arbeiter()
Async-Funktionsarbeiter () {
während (1 == 1)
{
Postmessage ("x");
warten Sie auf den Schlaf (1000);
}
}
Entwickler, die am Node.js-Code arbeiten, sollten nicht vergessen, dass sie - in der Regel auch vollständig native Module erstellen, wenn eine extrem hohe Leistung erforderlich ist. Diese können nicht nur die verschiedenen Betriebssystem-APIs nutzen, sondern auch in Programmiersprachen geschrieben werden, die auf dem Maschinencode zusammenstellen.
Dieser Artikel wurde ursprünglich in Ausgabe 291 des kreativen Webdesign-Magazins veröffentlicht Webdesigner . Ausgabe 291 kaufen .
Weiterlesen:
Doppelt sehen? Dieses Bild wurde mit dem Original umgedreht und gemischt (Bildkredite: Zukunft) Dieses Tu..
[Bild: Mittelkind] Rollover-Links sind eine großartige Möglichkeit, sich auf die Aufmerksamkeit eines Benutzers auf..
Welche Art von Künstler Sie sind, verstehen, wie man eine Person zeichnet, ist eine grundlegende Fähigkeit. Meistere die menschliche Form, und wenn es an..
Die Ferne arbeitete in den letzten Jahren in der Remote viel häufiger in der Webentwicklung. Vor der Versionskontrolle wäre das..
Wenn gut verwendet, CSS-Animation. kann Ihrer Website Zinsen und Persönlichkeit hinzufügen. In diesem Artikel gehen wir durch, wie er einen animierte..
Sobald Sie eine Idee für eine Fantasy-Kreatur gefunden haben, ist es der nächste Schritt, es zum Leben zu bringen, indem Sie es..
Der niederländische Post-Impressionist-Maler Vincent van Gogh (1853-1890) hat in seiner Karriere viele Selbstporträts geschaffe..
Anstatt ein letzter Erholungsort zu sein, kann und sollte und sollte ein wesentlicher Bestandteil Ihres kreativen Arsenal sein. V..