您可以使用来自另一个进程的 NodeJS 读取流吗?
Can you consume a NodeJS read stream from another process?
如果我在 nodejs 中打开一个读取流,我可以通过文件系统提供它而不实际将文件写入磁盘吗?那么,另一个应用程序可以指定“somefile.json”然后像读取普通文件一样读取文件吗?
是的。数据可以通过网络套接字反弹。但是,如果两个进程 运行 在同一个 Unix 主机上,数据可能会从节点写入命名管道,然后从另一个进程读取。
命名管道(也称为 fifos)是一种通过 OS 默认文件系统 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);
脚本将暂停执行(由于背压),直到其他进程从命名管道读取。
如果我在 nodejs 中打开一个读取流,我可以通过文件系统提供它而不实际将文件写入磁盘吗?那么,另一个应用程序可以指定“somefile.json”然后像读取普通文件一样读取文件吗?
是的。数据可以通过网络套接字反弹。但是,如果两个进程 运行 在同一个 Unix 主机上,数据可能会从节点写入命名管道,然后从另一个进程读取。
命名管道(也称为 fifos)是一种通过 OS 默认文件系统 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);
脚本将暂停执行(由于背压),直到其他进程从命名管道读取。