如果将文件可写入stream传递给Node.js中的Console构造函数,是否正在向其写入asynchronous?

我已经阅读了有关Console对象的文档和有关进程I / O的说明 ,但是不知道以下内容是否会导致同步或asynchronous操作:

const out = fs.createWriteStream('./out.log') const logger = new Console(out) logger.log('foo') 

我很好奇这是怎么回事,特别是在* Nix系统上。 但我不希望这在Windows上有不同的performance。 我所要问的原因是因为我已经构build了一个利用Console对象的logging器,但是我不希望logging器在生产中将日志写入文件时被阻塞。

它将是asynchronous的

内部Console类维护一个callback_stdoutErrorHandler触发写操作完成并检查错误。 我们可以使用它来testingasynchronous性。

 const fs = require('fs'); const { Console } = require('console'); const str = new Array(100).fill('').map(() => 'o'.repeat(1000 * 1000)).join(''); const out = fs.createWriteStream('./o.txt'); const logger = new Console(out); logger._stdoutErrorHandler = () => { console.log('written');}; logger.log(str); console.log('hey'); 

你会看到“嘿”在“书面”之前被打印出来。

关于进程I / O的注释适用于作为特殊stream的process.stdinprocess.stdout 。 当他们指向文件时,如下所示:

 $ node someCode.js > file.txt 

在Unix中,Unix中的写操作将是同步的。 这在这里按行处理。 在这种情况下, process.stdoutstream将连接到一个文件,而不是通常的Unix文件描述符fd1

tldr;
根据Node的官方文档,你在这里做的是同步的,因为你正在使用文件


写入可能是同步的,具体取决于stream连接的内容以及系统是Windows还是Unix:

  • 文件 :在Windows和Linux上同步
  • TTY(terminal) :在Windows上是asynchronous的,在Unix上是同步的
  • pipe道(和套接字) :在Windows上同步,在Unix上是asynchronous的

警告 :强烈build议不要在生产服务上使用这些同步操作,因为同步写入会阻止事件循环,直到写入完成。 生产日志时,这可能是一个严重的缺陷。

参考: Node.js官方文档/有关进程I / O的注释