gpt4 book ai didi

node.js - 有没有办法让子进程输出流更频繁地刷新其数据?

转载 作者:搜寻专家 更新时间:2023-10-31 23:45:19 24 4
gpt4 key购买 nike

我正在尝试将子进程的标准输出通过管道传输到父进程的标准输出:

import {exec} from 'child_process';

console.log(new Date() + " starting")
const child = exec(/* some command */);
child.stdout.pipe(process.stdout);

这可行,但是子进程生成数据相对于管道缓冲区的大小来说相当慢。数据以大块形式出现,而且并不频繁。

例如,如果我这样看子输出流:

child.stdout.on('data', data => console.log(new Date(), data.length));

输出是

2017-11-15T21:53:44.128Z starting
2017-11-15T21:53:58.319Z 8192
2017-11-15T21:54:02.321Z 8192
2017-11-15T21:54:07.384Z 8192
2017-11-15T21:54:11.333Z 8192
2017-11-15T21:54:15.281Z 8192
2017-11-15T21:54:19.008Z 3967

有没有办法让子输出流使用更小的缓冲区或更频繁地刷新?

最佳答案

操作系统和子进程控制输出缓冲。

例如,Python 有一个 -u 选项,它会导致写入被刷新(也是 PYTHONUNBUFFERED env var)。以下根据问题改编的示例显示了使用无缓冲输出和正常输出时每秒向屏幕写入一个整数的命令的行为差异。

const {exec} = require('child_process')

function run(cmd){
return new Promise((resolve, reject) => {
console.log("%s starting %s", Date.now(), cmd)
const child = exec(cmd)
child.stdout.pipe(process.stdout)
child.stderr.pipe(process.stderr)
child.on('exit', exit => {
console.log('%s exit', Date.now(), exit)
if ( exit === 0 ) return resolve(exit)
reject(new Error(exit))
})
})
}

async function go(){
await run('python -uc "import time; [print(i,str(time.sleep(1))) for i in range(10)]"')
await run('python -c "import time; [print(i,str(time.sleep(1))) for i in range(10)]"')
}

go()

如果正在运行的子进程没有等效的选项或配置来刷新输出,则 this Unix + Linux question包括许多通过修改子进程的运行方式来禁用缓冲输出的技巧,方法是分配一个伪终端或直接修改它的缓冲区。

还有 node-ptynode-pty2这将生成带有伪终端的进程,类似于预期的 unbuffer命令确实如此。我以前没有使用过任何一个模块,所以不能保证它们。

关于node.js - 有没有办法让子进程输出流更频繁地刷新其数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com