如何在Node.js中的主进程和子进程之间传递流输入/输出
我正在尝试使两个进程通过stdio
彼此“对话”:
ping.js
import { readline } from '../readline';
import { sleep } from '../sleep';
import { spawn } from 'child_process';
const spawnPongProcess = () => {
const child = spawn('node',
['-r', 'esm', `${__dirname}/pong.js`],
{ stdio: 'pipe' });
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
child.on('close', (code) => {
console.error(`child process exited with code ${code}`);
process.stdin.resume();
process.stdout.resume();
});
child.on('error', (err) => {
console.error(`child process error: ${err}`);
});
process.stdout.pipe(child.stdin);
child.stdout.pipe(process.stdin);
return child;
};
export const ping = async () => {
const child = spawnPongProcess();
await sleep(1000);
console.log('ping');
let pong = readline();
console.error(`Ping received: ${pong}`);
child.kill();
};
将父进程的stdout
传递给子进程stdin
,并将子进程stdout
传递给父进程stdin
,以允许进程通过stdio
进行通信。
pong.js
import { readline } from '../readline';
import { sleep } from '../sleep';
const pong = async () => {
console.log(`Pong initiated and waiting for input.`);
let ping = readline();
console.log(`Pong received: ${ping}`);
process.exit();
};
pong();
readline.js
import { question } from 'readline-sync';
export const readline = question;
sleep.js
export const sleep = (ms) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
输出为:
$ node -r esm src/index.js
Pong initiated and waiting for input.
ping
看来父进程(ping
)的输出未传递到子进程(pong
)。关于如何使其运作的任何想法?
您将进程的stdout
(可写)通过管道传输到子级的stdin
(可写),反之亦然。由于数据是通过stdin
(可读)接收的,因此您必须用管道代替stdout
:
process.stdin.pipe(child.stdin);
child.stdout.pipe(process.stdout);
您的代码不会抛出,因为如果stdout是终端,它将成为双工流。