Ich lese, dass die JavaScript-Sprache hat Eigenschaften, die bei der Implementierung von nicht-blockierenden IO helfen, die zum Erfolg von Projekten wie node.js beiträgt. Meine Frage ist, was sind diese Eigenschaften und warum ist nicht blockierende IO schwieriger in anderen Sprachen zu implementieren?Wie funktioniert nicht blockierende IO in Javascript
Antwort
Der Grund, warum Javascript manchmal als nicht blockierende E/A gekennzeichnet ist, liegt am Konzept der anonym definierten (eventbasierten) Funktionen. Node.js bezeichnet dies ausdrücklich als Argument dafür, warum JavaScript eine gute serverseitige Sprache ist. Dies ist jedoch nur eine halbe Wahrheit, da es technisch nicht blockierend ist, aber es wird weiterhin Code ausführen, während auf einen Rückruf von einer anonymen Callback/Ajax-Funktion gewartet wird. Ich bin mir nicht sicher, ob das das ist, was Sie lesen, aber eine Erklärung in einem Knoten tutorial ist:
"Die andere Methode, die von Node und einige extrem schnelle moderne Server wie Nginx und Thin genommen wird, ist zu Verwenden Sie einen einzelnen blockierungsfreien Thread mit einer Ereignisschleife, und dies ist der Punkt, an dem die Entscheidung für JavaScript wirklich gilt, da JavaScript für die Verwendung in einer auf Einzelschleifen basierenden Event-Loop-basierten Umgebung konzipiert wurde: der Browser Event-based Programmierung tot einfach: Sie rufen im Grunde nur eine Funktion, um eine Art von I/O durchzuführen und übergeben Sie eine Callback-Funktion und JavaScript erstellt automatisch eine Schließung, um sicherzustellen, dass der richtige Zustand erhalten bleibt, auch nachdem die aufrufende Funktion längst ist außer Reichweite geraten. "
Quelle: http://net.tutsplus.com/tutorials/javascript-ajax/this-time-youll-learn-node-js/
In Bezug auf Ihren Multithreading-Tag, Node.js und Javascript sind NICHT multithreaded, sie ein System von Verschlüssen verwenden Zustand zu erhalten, während für einen Rückruf warten. Daher sind sie NICHT vollständig nicht blockierend. Es gibt viele Szenarien, in denen eine Blockierung auftreten kann. Bei den meisten kleinen Implementierungen wird ein Entwickler jedoch nie auf eine Blockierungssituation stoßen.
siehe hier für möglich, Informationen darüber, warum node.js ist schlecht: http://teddziuba.com/2011/10/node-js-is-cancer.html (Link gebrochen)
und hier für eine rebuttle: http://rhyolight.posterous.com/nodejs-is-not-cancer (Link gebrochen)
sowohl der Krebs Link als auch der Nicht-Krebs-Link sind für mich tot –
Sorry darüber. Ich würde versuchen, die Artikeltitel zu googeln und zu sehen, ob sie irgendwo archiviert sind. Diese Links sind private Blogs, ich denke also, dass man davon ausgehen kann, dass sie nach 3 Jahren migrieren werden. – Jlange
auch, Node.js ist Multithread - alle E/A-Aufrufe in einem anderen Thread als die Main-Event-Schleife thread –
Asynchrone Funktionen sind normalerweise ereignisbasiert in JavaScript, was bedeutet, dass Callback-Handler registriert werden. Ihr Code läuft nach der Registrierung weiter, wartet aber nicht auf das Ereignis - alles, was nach einem Ereignis getan werden muss, muss vom Handler aufgerufen werden. Ich hoffe, das sagt alles.
Natürlich gibt es Ausnahmen, wie window.alert
/confirm
/prompt
in Browsern.
JavaScript selbst bietet keine nicht blockierenden IO. Die zugrunde liegenden Systemaufrufe, die node.js verwendet, führen die nicht blockierende E/A durch. Die erstklassigen Funktionen von JavaScript bedeuten, dass es einfach ist, Callbacks weiterzugeben, wenn IO abgeschlossen ist.
Andere Sprachen können nicht blockierende IO gut tun. node.js argumentiert nur, dass Callbacks es sehr einfach machen, über nicht blockierende Operationen nachzudenken und diese zu behandeln.
Ruby hat EventMachine, die Blöcke statt Funktionen übergibt. C kann nicht-blockierende IO mit Funktionszeigern machen, aber dann bekommt man keine Schließungen, also ist es ein bisschen mehr Schmerz.
- 1. Nicht blockierende IO für Android
- 2. Was blockiert in einfachen Worten IO und nicht-blockierende IO?
- 3. Wie funktioniert der nicht blockierende mysql-Client?
- 4. SET STATISTICS IO funktioniert nicht
- 5. Ist LinkedTransferQueue blockierende oder nicht blockierende Warteschlange?
- 6. Wie funktioniert Linux-blockierende E/A tatsächlich?
- 7. Warum/wie funktioniert rekursives IO?
- 8. Nicht blockierende Verbindung
- 9. Nicht blockierende Verbindung in Linux
- 10. Nicht blockierende Warte in Python
- 11. Nicht blockierende Darstellung in ReactJS
- 12. Scrapy: nicht blockierende Pause
- 13. Nicht blockierende Eingabeaufforderung? node.js
- 14. pyserial nicht blockierende Leseschleife
- 15. Nicht blockierende gleichzeitige Sammlung?
- 16. php socket_write über blockierende und nicht blockierende Sockets
- 17. Spielen! Framework: Beschränken Sie gleichzeitige nicht blockierende IO-Aufrufe über WS
- 18. Android: blockierende oder nicht blockierende Warteschlange für fortlaufende SQL-Einsätze?
- 19. Lesen einer Datei in Javascript ohne blockierende E/A
- 20. Linux, Sockets, nicht blockierende Verbindung
- 21. Warum sollte ich nicht blockierende oder blockierende Sockets verwenden?
- 22. Wie erstelle ich eine nicht blockierende Funktion?
- 23. Blockieren von IO gegenüber nicht blockierenden IO; Auf der Suche nach guten Artikeln
- 24. Nicht-blockierende Socket-IOs mit EOF multiplizieren
- 25. PHP nicht blockierende Anwendungen schreiben
- 26. Nicht blockierende Socket mit TCP
- 27. Nicht blockierende Messagebox & DllImport Nachteile
- 28. Nicht blockierende Leitung mit popen?
- 29. Haskell, wie IO IO Monad
- 30. Nicht-blockierende Wartefunktion in Objective-C
Wie schrieb das? Die asynchrone E/A ist, soweit ich weiß, eine knotenspezifische Erweiterung (obwohl sie eine reine JS-Schnittstelle verwendet). – delnan
Die Sprache bietet keine blockierungsfreie IO. Bestimmte Frameworks tun dies jedoch. – Cameron
Können Sie das Dokument bereitstellen, das Sie gelesen haben?Vielleicht meinten sie, dass Sprachsyntax und Semantik für nicht blockierende E/A sorgen. –