2013-06-20 4 views
6

Früher habe ich heute auf eine Frage mit this answer. geantwortet. In dem Beispiel, das ich gepostet habe, habe ich die synchrone Version eines Aufrufs im bcrypt-Knotenmodul verwendet. Ich entschied mich dafür, die synchrone Version des Aufrufs hauptsächlich zu verwenden, weil ich dachte, dass die Antwort etwas sauberer aussah, aber ich dachte auch nicht, dass dies die Leistung beeinträchtigen würde, weil bcrypt CPU- und speicherintensiv statt I/O-gebunden ist. Es war mein Verständnis, dass Knoten fast den gesamten Code in einem einzigen Thread wie Browser ausgeführt und nur Hintergrundthreads für Dinge wie E/A und Datenbankzugriff verwendet. Dies führte mich zu der Annahme, dass CPU-intensive Aufgaben den Server immer noch im Wesentlichen "blockieren", da es keine anderen Threads gab, an die die Arbeit ausgelagert werden konnte.Beschleunigt die asynchrone Programmierung in node.js CPU-gebundene Aufgaben?

Ein Kommentar zu meiner Antwort zeigte, dass meine Annahme falsch war, und nach einigen Recherchen wurde mir klar, dass ich nicht wirklich wusste, wie node.js mit solchen Dingen umgeht. Beschleunigt die asynchrone Programmierung in node.js cpu und speicherintensive Aufrufe? Wenn ja, wie geht das?

+0

"Beschleunigt die asynchrone Programmierung in node.js cpu und speicherintensive Aufrufe?" - Es tut so, als ob es so wäre. Wie Sanduhren beschleunigen das OS, wenn Sie sie betrachten. – zerkms

Antwort

7

Es hängt davon ab, wie das Modul implementiert ist.

Wenn das Modul ohne Unterstützung für Threading implementiert ist, dann kann die CPU-gebundene Verarbeitung nicht asynchron durchgeführt werden. Einige Funktionen bieten Rückrufe und mein Aussehen ist asynchron, aber sie sind es wirklich nicht. Sie laufen tatsächlich synchron und blockieren die Ereignisschleife. Beispiele hierfür in Javascript ist Array.forEach().

Module können jedoch implementiert werden, um die Verarbeitung in Hintergrundthreads durchzuführen. In diesem Fall ist es wirklich asynchron und kann CPU-gebundene Aufgaben beschleunigen. Zumindest befreit es die Ereignisschleife, um eingehende Anfragen zu bearbeiten, während der Hintergrundthread beschäftigt ist, Ergebnisse zu berechnen.

Ein Beispiel hierfür ist die Funktion crypto.pbkdf2() im knoteneigenen Crypto-Modul.

Aber, wie können Module Code in anderen Threads ausführen, wenn node.js in einem einzelnen Thread ausgeführt wird?

Die ursprüngliche Art, dies zu implementieren, war einfach, dass das Modul nicht in Javascript geschrieben wurde, sondern stattdessen in C/C++ geschrieben und über die addons API mit node.js verbunden wurde.

Aber heutzutage können sogar reine Javascript-Module und Funktionen Threads und/oder Prozesse spawnen. Knoten hat ein experimentelles Modul namens Cluster, das einen Master/Slave-Cluster von Knotenprozessen aufbaut. Ihr Modul oder Code kann dann die CPU-gebundene Aufgabe in einem Arbeitsprozess ausführen, wodurch der Hauptknotenprozess freigegeben wird, um die Ereignisschleife zu verarbeiten. Es gibt auch mehrere Threading-Module auf npm. Suchen Sie einfach nach "thread" auf npmjs.org.

Also können CPU-gebundene Tasks schneller ausgeführt werden oder zumindest die Hauptereignisschleife nicht blockieren, indem sie asynchron ausgeführt werden.

+1

Große Antwort. Nach dem Durchsehen des Quellcodes stellt sich heraus, dass das von mir empfohlene bcrypt-Modul tatsächlich C/C++ - Code verwendet, um seine Berechnungen durchzuführen, und durch asynchrone Aufrufe beschleunigt würde. Ich nehme an, der Kommentator meiner ursprünglichen Antwort war richtig, und Sie sind wahrscheinlich besser dran, wenn Sie die asynchronen Anrufe standardmäßig verwenden und nur die synchronen Anrufe auswählen, wenn Sie wissen, dass es notwendig ist. – TwentyMiles

Verwandte Themen