最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何在Node.js中的主进程和子进程之间传递流输入输出

运维笔记admin11浏览0评论

如何在Node.js中的主进程和子进程之间传递流输入/输出

如何在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是终端,它将成为双工流。

发布评论

评论列表(0)

  1. 暂无评论