process.stdout
流的行为是“同步”的,这意味着每次调用stdout.write
都会立即触发一个write
系统调用 -- 没有缓冲。例如:import { stdout } from 'process';
for (let i = 1; i <= 1000; i++) {
stdout.write(`line ${i}\n`);
}
stdout.end();
在编写传统的Unix数据发射工具时,可能需要进行1000次write
系统调用。这并不是您想要的。可以绕过process.stdout
,创建一个独立的可写流,将其指向文件描述符1。
import { stdout } from 'process';
import { createWriteStream } from 'fs';
let ostream = createWriteStream("/ignored", { fd: stdout.fd });
for (let i = 1; i <= 1000; i++) {
ostream.write(`line ${i}\n`);
}
ostream.end();
仅进行一次系统调用,但是这样的绕过方式是危险的——在ostream.end
调用之后,文件描述符1被关闭,但是process.stdout
对象并不知道。
在使用process.stdout
时,是否有官方方法可以获得缓冲输出?在我看来,理想情况下应该像C语言的setvbuf
函数一样操作。