【发布时间】:2021-11-14 13:23:16
【问题描述】:
如果我在 nodejs 中打开一个读取流,我可以通过文件系统提供它而不实际将文件写入磁盘吗?那么,另一个应用程序可以指定“somefile.json”,然后像普通文件一样读取该文件?
【问题讨论】:
标签: node.js stream interprocess
如果我在 nodejs 中打开一个读取流,我可以通过文件系统提供它而不实际将文件写入磁盘吗?那么,另一个应用程序可以指定“somefile.json”,然后像普通文件一样读取该文件?
【问题讨论】:
标签: node.js stream interprocess
是的。数据可以通过网络套接字反弹。但是,如果两个进程在同一 Unix 主机上运行,则数据可能会从节点写入命名管道,然后从另一个进程读取。
命名管道(也称为 fifos)是一种通过操作系统的默认文件系统 API 提供跨进程通信的便捷方法。
命名管道源可以使用第三方库在 NodeJS 中实例化,并被视为可写流接收器
import fifo from "mkfifo";
import util from "util";
import crypto from "crypto";
import stream from "stream";
import fs from "fs";
(async ()=>{
await new Promise(resolve => fifo.mkfifo("fifo-file", 0o600, resolve));
await util.promisify(stream.pipeline)(
function*(){
for(let i=0;i<100;i++){
yield JSON.stringify({ id: crypto.randomBytes(6).toString("hex") }) + "\n";
}
},
fs.createWriteStream("fifo-file")
);
})()
.catch(console.error);
脚本将在执行时暂停(由于背压),直到其他进程从命名管道中读取。
【讨论】: