gpt4 book ai didi

java 似乎没有及时读取我的 perl 管道输出并且正在填满

转载 作者:行者123 更新时间:2023-11-30 05:11:03 25 4
gpt4 key购买 nike

我有以下代码片段,调用写入 STDERR 和 STDOUT 的 perl 脚本。我一直在遵循推荐的程序,例如自动刷新 perl 脚本中的 STDOUT 和 STDERR 以及使用 Streamgobbler 线程。我注意到这在一定程度上帮助了我的问题,但有时 perl 脚本生成大量输出,它仍然会填满管道并挂起。唯一似乎阻止将以下内容添加到我的 perl 脚本中的事情,但显然我想要输出,所以这不是一个选项。

更新>>

另一个有趣的现象是,当我在 Linux 中使用/proc/pid/fd/pipe# 时,它会导致管道被读取并被访问。这似乎转储了管道的内容,这意味着我的 Perl 进程可以再次写入它,从而完成。因此一定是我的 java 进程没有正确读取进程输出流。

PERL:

close STDOUT 
close STDERR

我的java如下所示

   parserProcess = run.exec(config.getCMDArray(),env);

StreamGobbler errorGobbler = new StreamGobbler(parserProcess.getErrorStream(), "ERROR");

// any output?
StreamGobbler outputGobbler = new StreamGobbler(parserProcess.getInputStream(), "OUTPUT");

// kick them off
errorGobbler.start();
outputGobbler.start();

其中 StreamGobbler 是 ->

class StreamGobbler extends Thread
{
InputStream is;
String type;

StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}

public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}



String line="";

status = parserProcess.waitFor();

提前致谢

最佳答案

我认为您正在描述 Perl 和 Java 应用程序的正常行为。管道后面的缓冲区的实际大小未定义/取决于操作系统,但可能小至 1KB 或 16KB。对于输出生成过程来说,阻塞直到其文本被消耗是明智的;另一种选择是什么?为管道缓冲区分配更大的内存量?

如果您使用上述代码进行实验,那么您的处理速度会受到 Java 控制台输出(即 System.out.println() 调用)的瓶颈。我认为如果您对打印输出进行注释(仅用于测试),您会看到 Java 非常快速地吸收 Perl 输出。

关于java 似乎没有及时读取我的 perl 管道输出并且正在填满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3360958/

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