Update: Ab Knoten 0.6 ist dieser Beitrag veraltet, da stdout jetzt synchron ist .
Mal sehen, was console.log
eigentlich macht.
Zuallererst ist es Teil des Konsolenmoduls :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Es werden also einfach einige Formatierungen und Schreibvorgänge durchgeführt process.stdout
, bisher nichts Asynchrones.
process.stdout
ist ein beim Start definierter Getter , der träge initialisiert wird. Ich habe einige Kommentare hinzugefügt, um die Dinge zu erklären:
.... code here...
process.__defineGetter__('stdout', function() {
if (stdout) return stdout; // only initialize it once
/// many requires here ...
if (binding.isatty(fd)) { // a terminal? great!
stdout = new tty.WriteStream(fd);
} else if (binding.isStdoutBlocking()) { // a file?
stdout = new fs.WriteStream(null, {fd: fd});
} else {
stdout = new net.Stream(fd); // a stream?
// For example: node foo.js > out.txt
stdout.readable = false;
}
return stdout;
});
Im Falle eines TTY und UNIX landen wir hier , dieses Ding erbt von Socket. Alles, was dieser Knoten grundsätzlich tut, ist, die Daten auf den Socket zu übertragen, und das Terminal kümmert sich um den Rest.
Lass es uns testen!
var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
data += data; // warning! gets very large, very quick
}
var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);
Ergebnis
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
Das Terminal benötigt ungefähr 1 Sekunde, um den Socket-Inhalt auszudrucken, aber der Knoten benötigt nur 17 Millisekunden, um die Daten zum Terminal zu übertragen.
Gleiches gilt für den Stream-Fall, und auch der Dateifall wird asynchron behandelt .
Also ja, Node.js hält an seinen nicht blockierenden Versprechen fest.
process.stdout.write()
wowrite()
per Definition asynchron ist ...console.warn () und console.error () blockieren. Sie werden erst zurückgegeben, wenn die zugrunde liegenden Systemaufrufe erfolgreich waren.
Ja, ein Programm kann beendet werden, bevor alles, was in stdout geschrieben wurde, gelöscht wurde. process.exit () beendet den Knoten sofort, auch wenn noch Schreibvorgänge in stdout in der Warteschlange stehen. Sie sollten console.warn verwenden, um dieses Verhalten zu vermeiden.
quelle
console.warn()
undconsole.error()
haben das gleiche nicht blockierende Verhalten vonconsole.log()
. Es gibt sogar ein Paket, um das Problem in Windows zu lösen .Meine Schlussfolgerung nach dem Lesen von Node.js 10. * docs (im Anhang unten). ist, dass Sie console.log für die Protokollierung verwenden können, console.log ist synchron und auf niedriger Ebene implementiert. c. Obwohl console.log synchron ist, verursacht es nur dann kein Leistungsproblem, wenn Sie keine große Datenmenge protokollieren.
(Das folgende Befehlszeilenbeispiel zeigt, dass console.log async und console.error synchron sind. )
Basierend auf Node.js Docs
$ node script.js 2> error.log | tee info.log
Ich hoffe es hilft
quelle
Console.log ist in Windows asynchron, während es unter Linux / Mac synchron ist. Um console.log in Windows synchron zu machen, schreiben Sie diese Zeile am Anfang Ihres Codes wahrscheinlich in die Datei index.js. Jedes console.log nach dieser Anweisung wird vom Interpreter als synchron betrachtet.
quelle